数独を解くプログラム 1994年頃作成

縦型探索で複数解も出るようです。
数独を解くプログラム 2006 1.2 石崎豪洋

1994年に文春に載っていたものを解いたと私のプログラムのソースに書いてあります。

mondai.txtを作成して、

半角の数字で81個、空いているところはゼロで埋めて、左から右へデータを全部入れて改行してください。

0
0
0
0
0
1
2
0
0
0
4
3
0
0
0
0
6
0
0
2
0
0
5
6
0
0
7
0
0
0
4
0
0
7
0
6
0
0
1
0
6
0
9
0
0
9
0
5
0
0
8
0
0
0
7
0
0
6
9
0
0
1
0
0
5
0
0
0
0
6
4
0
0
0
6
2
0
0
0
0
0

kotae.txtのファイルが作成されて答えが出ます。

697841235
543927861
128356497
832419756
471562983
965738124
784695312
259173648
316284579


suudoku.exeをダウンロード


ソースリストです。半角のカタカナで注釈が書いてあったのですが、上手く載りません。
実行ファイルはVC++Ver5で修正してファイルの入出力を追加してあります。


/*

辞涯ン 勿歇| 鋪殉ル 蹴爪ク 霧蹴恐 摂燦 餅杆湫ム

*/

#include<stdio.h>
#include<time.h>
/* 擴折イ 筑粟
char a[82]=" 085020670700105002104030508070508010401090807030706020207060109500409006069050730";
*/
/*
char a[82]=" 000001200043000060020056007000400706001060900905008000700690010050000640006200000";
*/
char a[82]=" 032000500400010700500700062007000000010030020000000600290005007008090006006000410";

char b[82];
/* 1s */
/* V30 14s */
/* 486 3s */

main(){
char f,i,j,y,xx,yy,xa,ya,xb,yb;
char x,xc,yc;
int cc;
for(i=1;i<82;++i){
a[i]=a[i]-0x30;
b[i]=a[i];
printf("%d",a[i]);}

cc=0;
clrscr();
pr();


x=1;

l160:
if (b[x]>0) goto l450;
l190:

/*printf("\n cc= %u ",cc);*/

cc++;
a[x]=a[x]+1;if (a[x]>9) goto l550;

/* 灼ア鋼 醒 */
yc=x/9;xc=x%9;if (xc==0) xc=9; else yc++;

/*printf("%d %d %d %d",x,yy,xc,yc);
scanf("%d",&i);*/

for(y=1;y<10;++y){
j=(y-1)*9+xc;
if ((a[j]==a[x]) && (j != x)) goto l190;
}

/* 嶌 */
for(xx=1;xx<10;++xx){
j=(yc-1)*9+xx;
if ((a[j]==a[x]) && (j !=x )) goto l190;
}

/* 9*9 */
xa=xc/3;ya=yc/3;

if (xc%3>0) xa=xa+1;
if (yc%3>0) ya=ya+1;

for(yb=(ya-1)*3+1;yb<(ya-1)*3+4;++yb){
for(xb=(xa-1)*3+1;xb<(xa-1)*3+4;++xb){
if((a[(yb-1)*9+xb]==a[x])&&((yb-1)*9+xb!=x)) goto l190;
}}

/* 誇蔚渫 */
l450:
x=x+1;
if (x>81) { printf("\n長タ %u \n\n",cc);pr();x=81;goto l160;}
goto l160;

/* 誇散渫 */
l550:
if (a[1]>9) {printf("\n恐甜\n");goto end;}

/*printf("誇散渫");*/

a[x]=0;
l600:
x=x-1;
if (b[x]>0) goto l600;
goto l160;

end:
i=clock();printf("\ntime = %d (s)\n",i);

printf("end");
}


/* 邦骸゙ */

pr(){
int xx,yy,j;
j=0;
for(yy=1;yy<10;++yy){
for(xx=1;xx<10;++xx){
printf("%d",a[(yy-1)*9+xx]);
/*j++;if(j==3){j=0;printf(" ");}*/
}
printf("\n");
}

}
オセロ 今ひとつであるが動作する 1992-3年頃