第27講 数独(ナンプレ)自動生成
第13話 新しい番号付けとそれに対応する座標を設定するプログラムの解説その5

今話では
   for(i=0;i<3;i++){
     for(j=0;j<3;j++){
        for(k=0;k<3;k++){
          for(l=0;l<3;l++){
             a[3*i+k][3*j+l]=9*(3*i+j)+3*k+l;
          }
        }
     }
   }
の動きをトレースの続き
・・・・・・
・・・・・・
i=1のとき

・・・・・・

 j=2のとき
  k=0のとき
   l=0のとき
    a[3*i+k][3*j+l]=a[3*1+0][3*2+0]=a[3][6]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*0+0=45
    から、a[3][6]=45

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45
4 30 31 32 39 40 41
5 33 34 35 42 43 44

   l=1のとき
    a[3*i+k][3*j+l]=a[3*1+0][3*2+1]=a[3][7]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*0+1=46
    から、a[3][7]=46

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
4 30 31 32 39 40 41
5 33 34 35 42 43 44

   l=2のとき
    a[3*i+k][3*j+l]=a[3*1+0][3*2+2]=a[3][8]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*0+2=47
    から、a[3][8]=47

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46 47
4 30 31 32 39 40 41
5 33 34 35 42 43 44

  k=1のとき
   l=0のとき
    a[3*i+k][3*j+l]=a[3*1+1][3*2+0]=a[4][6]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*1+0=48
    から、a[4][6]=48

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46 47
4 30 31 32 39 40 41 48
5 33 34 35 42 43 44

   l=1のとき
    a[3*i+k][3*j+l]=a[3*1+1][3*2+1]=a[4][7]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*1+1=49
    から、a[4][7]=49

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49
5 33 34 35 42 43 44

   l=2のとき
    a[3*i+k][3*j+l]=a[3*1+1][3*2+2]=a[4][8]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*1+2=50
    から、a[4][8]=50

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44

  k=2のとき
   l=0のとき
    a[3*i+k][3*j+l]=a[3*1+2][3*2+0]=a[5][6]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*2+0=51
    から、a[5][6]=51

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46 47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44 51

  l=1のとき
    a[3*i+k][3*j+l]=a[3*1+2][3*2+1]=a[5][7]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*2+1=52
    から、a[5][7]=52 

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44 51 52

   l=2のとき
    a[3*i+k][3*j+l]=a[3*1+2][3*2+2]=a[5][8]
    9*(3*i+j)+3*k+l=9*(3*1+2)+3*2+2=53
    から、a[5][8]=53 

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44 51 52 53


以下同様です。
どうです。見事に

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44 51 52 53
6 54 55 56 63 64 65 72 73 74
7 57 58 59 66 67 68 75 76 77
8 60 61 62 69 70 71 78 79 80

が再現されていきますね。
では、新しい番号付けで数独を生成するとどうなるでしょうか。
速くなるのでしょうか、
遅くなるのでしょうか、
それとも変わらないのでしょうか。
関数fの
     for(j=y-y%3;j<y-y%3+3;j++){
        for(k=x-x%3;k<x-x%3+3;k++){
          if(9*j+k==g)goto tobi1;
          if(m[y][x]==m[j][k])goto tobi;
        }
     }
     tobi1:;
のコードはかなり簡単になります。

0 1 2 3 4 5 6 7 8
0 0 1 2 9 10 11 18 19 20
1 3 4 5 12 13 14 21 22 23
2 6 7 8 15 16 17 24 25 26
3 27 28 29 36 37 38 45 46
47
4 30 31 32 39 40 41 48 49 50
5 33 34 35 42 43 44 51 52 53
6 54 55 56 63 64 65 72 73 74
7 57 58 59 66 67 68 75 76 77
8 60 61 62 69 70 71 78 79 80

を見ればどうすればよいかよく考えて下さい。

第12話へ 第14話へ


a

eclipse c++ 入門講義第1部へ

eclipse c++ 入門講義第2部へ


魔方陣 数独で学ぶ VBA 入門
数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
VC++ C言語 C++ 入門 初心者 基礎から応用まで
本サイトトップへ