第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 |
を見ればどうすればよいかよく考えて下さい。