数独を解くプログラム 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年頃 | ||