㈠ c語言實現,9*9的方陣,每行和每列填入1-9,並使行和列中的數各不相同 (類似數獨,但沒有每3*
對碰羨角線算不算笑歷拍?
不算的話很好弄的。
#include<stdio.h>
intmain(void)
{
inti,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++)
printf("%d",(i+j)%9爛卜+1);
printf(" ");
}
return0;
}
㈡ 如何C語言編寫數獨游戲
當年我們做大程的時候本來也想做數獨來著,後來時間不夠沒做成.不知道專業人士怎麼編的,只能提供一點當時的思路給你,
1.9*9個格子對應一個數組A,數組的第一個值從0到9表示其中填的數字,0就是不填,另一個值表示它在桌面上的位置就是坐標
2.需要10張圖片,空白和9個數字
3.通過對滑鼠點擊的反應改變格子數組A的值,且將相應圖片覆蓋在相應坐標上
4.事先輸入若干組數組A的值(每組81個數),作為題庫
5.進行游戲時隨機抽取題庫中的一組,再隨機抽取若干格子顯示出來,其他留白.
6.填完後用三個循環判斷下每行每列每塊是否有相同的數字,沒有則通過.
具體編按鈕、放圖、滑鼠點擊響應等各種問題查一下書,有很多書上有很多教的這種一小段一小段的程序源代碼,直接抄下就行了。
加油^^
㈢ C語言數獨問題,100分求教
花了點時間,總算寫出來了,不知道和你要的意思一不一樣,這次應該沒問題了:
#include<stdio.h>
charFlag[2][9][9]={0};
charSu[3][3][3][3]={0};
introll(introw,intcol,inti,intj,charnum,inte){
printf(" 第%d行第%d列的%c不合理!",i+1,j+1,num);
switch(e){
case5:
printf("九宮格內數字重復");
break;
case7:
printf("數獨行內數字重復");
break;
case9:
printf("數獨列內數字重復");
break;
}
printf(" (回車鍵繼續,任意字元回車退出):");
if(getchar()!=' '){
while(getchar()!=' ');
returne;
}
//清除整個數獨行列標記
char(*unit)[3]=Su[row][col];
if(e>5){
//循環整個九盯頃宮格
while(i>=0){
//循環九宮格清除行列標記
while(--j>=0){
charc=unit[i][j]-'1';
e=row*3+i;
Flag[0][e][c]=0;
e=col*3+j;
Flag[1][e][c]=0;
}
j=3;
i--;
}
}
returnsd(row,col);
}
intsd(introw,intcol){
charnum,flag[9]={0};
char(*unit)[3]=Su[row][col];
inti,j,x;
statictip=1;
if(tip){tip=0;
printf("123 456 789 請按如上格式(下同)輸入 ");
}
printf("第%d行第%d個九宮格: ",row+1,col+1);
scanf("%s %s %s",unit[0],unit[1],unit[2]);getchar();
printf("第%d行第%d個九宮格",row+1,col+1);
//循環整個九宮格
for(i=0;i<3;i++){
//循環九宮格每行是否合法
for(j=0;j<3;j++){
num=unit[i][j];
if(num<'1'||num>'9'){
printf(" 只能輸入1-9的數字!");
returnroll(row,col,i,j,num,1);
}
//判斷數獨單元是否合理
if(flag[num-'1']){
returnroll(row,col,i,j,num,5);
}else{
flag[num-'1']=1;
}
//判斷整個數獨中單元所在行鍵巧是否合理
x=row*3+i;
if(Flag[0][x][num-'1']){
returnroll(row,col,i,j,num,7);
}else{
Flag[0][x][num-'1']=1;
}
//判斷整個數獨中單元所在列是否合理
x=col*3+j;
if(Flag[1][x][num-'1'稿則鍵]){
returnroll(row,col,i,j,num,9);
}else{
Flag[1][x][num-'1']=1;
}
}
}
printf("輸入完成 ");
return0;
}
intmain(){
inti,j;
intx,y;
//循環整個數獨
for(i=0;i<3;i++){
//循環每行數獨九宮格
for(j=0;j<3;j++){
//數獨九宮格輸入和測試
if(x=sd(i,j)){
returnx;
}
}
}
printf(" 輸入全部通過");
printf(" 完整的數獨如下:");
//循環輸出整個數獨
for(x=0;x<3;x++){
printf(" ");
//循環九宮格一列
for(i=0;i<3;i++){
//輸出數獨一整行
for(y=0;y<3;y++){
//輸出九宮格一行
for(j=0;j<3;j++){
printf("%c",Su[x][y][i][j]);
}
printf("");
}
printf(" ");
}
}
return0;
}
㈣ 用c語言寫一個簡易數獨的思路。要代碼
#include<stdio.h>
intnum[9][9],xy[9][9];
intcheck(intx,inty){
inti,m,n;
for(i=0;i<9;i++)
if((xy[x][y]==xy[i][y]&&i!=x)||(xy[x][y]==xy[x][i]&&i!=y))
return0;
for(i=0,m=x/3*3,n=y/3*3;i<9;i++)
if(xy[x][y]==xy[m+i/3][n+i%3]&&m+i/3!=x&&n+i%3!=y)
return0;
return1;
}
voidsearch(intx,inty){
if(x==9)
for(x=0;x<9;x++){
for(y=0;y<9;y++)
printf("%d",xy[x][y]);
printf(" ");
}
elseif(num[x][y])
search(x+(y+1)/9,(y+1)%9);
else
for(xy[x][y]=1;xy[x][y]<=9;xy[x][y]++)
if(check(x,y))
search(x+(y+1)/9,(y+1)%9);
return;
}
intmain(){
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++){
scanf("%d",&num[i][j]);
xy[i][j]=num[i][j];
}
search(0,0);
return0;
}
輸入為9行9列整數,已知的整數填寫對應的數字,尚待計算的未知數字填寫0。
該代碼的思路很簡單,就是從第一行第一列開始依次填入數字,檢查是否是在同一行、同一列、同一宮有沒有填入重復數字,如果沒有就繼續填入下一個數字,如果有就返回。
雖然效率稍低,但原理簡單、表述直白、易於理解,更有效率的代碼是使用十字鏈表完成,如有興趣可繼續深入
㈤ 編寫C程序隨機生成一個9行九9列的數組,滿足每一行每一列每一個粗線宮內的數字均含1-9,不重復。
代碼摘自:www.cnblogs.com/boyiliushui/p/4501399.html
代碼有用的話去感謝下原作者吧~
#include<stdio.h>
#include<stdlib.h>
#defineBOOLint
#defineFALSE1
#defineTRUE0
typedefstructnode
{
intcol;
introw;
intvalue[10];
}Node;
intfindvalue(intsudoku[9][9],Node*node);
BOOLgeneral_inspection(intsudoku[9][9]);
intblank_num(intsudoku[9][9]);
Node*mem_alloc(intnum_of_empty);
voidtrace(intsudoku[9][9],Node*node_stack,intnum_of_empty);
voidprint_sudoku(intsudoku[9][9]);
intmain(void)
{
intsudoku[9][9]={{0,0,5,3,0,0,0,0,0},
{8,0,0,0,0,0,0,2,0},
{0,7,0,0,1,0,5,0,0},
{4,0,0,0,0,5,3,0,0},
{0,1,0,0,7,0,0,0,6},
{0,0,3,2,0,0,0,8,0},
{0,6,0,5,0,0,0,0,9},
{0,0,4,0,0,0,0,3,0},
{0,0,0,0,0,9,7,0,0}
};
intnum_of_empty;
//為回溯棧分配空間
Node*node_stack;
if(general_inspection(sudoku))
{
printf("此數獨存在錯誤!請檢查
");
print_sudoku(sudoku);
return0;
}
num_of_empty=blank_num(sudoku);
node_stack=mem_alloc(num_of_empty);
trace(sudoku,node_stack,num_of_empty);
print_sudoku(sudoku);
return0;
}
BOOLgeneral_inspection(intsudoku[9][9])
{
inttemp[10]={0,0,0,0,0,0,0,0,0,0};
inti,j,m,n;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(sudoku[i][j]!=0)
{
//檢查所在行
for(m=0;m<10;m++)
temp[m]=0;
for(m=0;m<9;m++)
if(sudoku[i][m]!=0)
氏亂伏{
if(temp[sudoku[i][m]]==0)
temp[sudoku[i][m]]=1;
else
returnFALSE;
}
//檢查所在列
for(m=0;m<10;m++)
temp[m]=0;
for(m=0;m<9;m++)
if(sudoku[m][j]!=0)
{
if(temp[sudoku[m][j]]==0)
temp[sudoku[m][j]]=1;
else
returnFALSE;
}
陪蔽//檢查所在九宮格
for(m=0;m<10;m++)
temp[m]=0;
for(m=0;m<3;m++)
for(n=0;n<3;n++)
殲攜if(sudoku[i/3*3+m][j/3*3+n]!=0)
{
if(temp[sudoku[i/3*3+m][j/3*3+n]]==0)
temp[sudoku[i/3*3+m][j/3*3+n]]=1;
else
returnFALSE;
}
}
returnTRUE;
}
intblank_num(intsudoku[9][9])
{
//計算所給數獨中待填入的空白數
inti,j,num=0;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(sudoku[i][j]==0)
num++;
returnnum;
}
Node*mem_alloc(intnum_of_empty)
{
Node*node_stack=(Node*)malloc(sizeof(structnode)*num_of_empty);
if(node_stack==NULL)
{
printf("內存分配失敗!
");
exit(1);
}
returnnode_stack;
}
voidtrace(intsudoku[9][9],Node*node_stack,intnum_of_empty)
{
inti,j,index,k=0;
//回溯法求解數獨
while(num_of_empty)
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(sudoku[i][j]==0)
{
(node_stack+k)->col=i;
(node_stack+k)->row=j;
sudoku[i][j]=findvalue(sudoku,node_stack+k);
if(sudoku[i][j]==-1)
{
sudoku[i][j]=0;
k--;
while((node_stack+k)->value[0]==0)
{
//當棧空,說明數獨錯誤,無解
if(k==0)
{
printf("此數獨無解!
");
//free(node_stack);//為啥這里一釋放內存,就彈出debugassertionfailed窗口啊!
exit(1);
}
sudoku[(node_stack+k)->col][(node_stack+k)->row]=0;
num_of_empty++;
k--;
}
for(index=1;index<10;index++)
if((node_stack+k)->value[index]==0)
{
sudoku[(node_stack+k)->col][(node_stack+k)->row]=index;
(node_stack+k)->value[index]=1;
(node_stack+k)->value[0]--;
break;
}
num_of_empty++;
i=(node_stack+k)->col;
j=(node_stack+k)->row;
}
k++;
num_of_empty--;
}
}
}
}
//棧空間使用結束,釋放
free(node_stack);
node_stack=NULL;
}
intfindvalue(intsudoku[9][9],Node*node)
{
intm,n,i=node->col,j=node->row;
//初始化棧中存儲候選值的數組
for(m=0;m<10;m++)
node->value[m]=0;
for(m=1;m<10;m++)
{
node->value[sudoku[i][m-1]]=1;
node->value[sudoku[m-1][j]]=1;
}
for(m=0;m<3;m++)
for(n=0;n<3;n++)
node->value[sudoku[i/3*3+m][j/3*3+n]]=1;
//node->value[0]記錄候選值個數,前面的循環可能會修改掉它,需要重新賦0值
node->value[0]=0;
for(m=1;m<10;m++)
if(node->value[m]==0)node->value[0]++;
for(m=1;m<10;m++)
if(node->value[m]==0)
{
node->value[m]=1;
node->value[0]--;
break;
}
//返回候選值m,若無候選值可用,返回錯誤標記-1
if(m==10)
return-1;
else
returnm;
}
voidprint_sudoku(intsudoku[9][9])
{
//列印數獨
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%2d",sudoku[i][j]);
printf("
");
}
}
㈥ 求用C語言編一個解九宮格數獨的程序
前兩天剛寫完,還沒優化,已運行通過了.
暈,一維的好麻煩,這個也是碰巧前兩天剛寫好的,你看著自己修改下
#include
<stdio.h>
typedef
struct
{
int
line;
int
row;
int
num;
}Node;
int
main()
{
/*
int
a[9][9]={
{4,0,3,6,0,0,0,0,0},
{0,0,0,0,0,1,0,2,4},
{0,1,0,0,4,0,5,0,0},
{0,0,0,9,0,4,0,6,0},
{3,0,2,0,0,0,4,0,9},
{0,7,4,1,0,3,0,0,0},
{0,0,1,0,9,0,0,4,0},
{2,4,0,3,0,0,0,0,0},
{0,0,0,4,0,8,2,0,7}};
*/
int
a[9][9]={
{0,0,0,8,0,0,0,6,0},
{8,7,0,0,0,0,0,0,0},
{2,9,0,0,4,1,0,0,5},
{0,0,5,7,0,0,0,0,9},
{0,2,0,0,0,0,0,1,0},
{9,0,0,0,0,4,3,0,0},
{7,0,0,6,1,0,0,9,8},
{0,0,0,0,0,0,0,5,2},
{0,6,0,0,0,9,0,0,0}};
/*
int
a[9][9]={
{0,2,0,0,6,0,0,0,0},
{0,9,0,4,0,5,1,3,0},
{0,0,8,7,0,0,0,0,5},
{6,0,0,3,0,0,4,0,0},
{0,0,0,9,0,6,0,0,0},
{0,0,7,0,0,1,0,0,3},
{4,0,0,0,0,7,3,0,0},
{0,8,5,2,0,4,0,7,0},
{0,0,0,0,9,0,0,1,0}};
*/
/*
int
a[9][9]={
{0,0,3,0,2,0,0,0,6},
{0,0,2,0,9,0,0,0,4},
{7,0,0,8,0,0,2,0,3},
{0,8,0,0,7,0,5,0,0},
{0,7,0,1,0,6,0,3,0},
{0,0,0,2,0,0,0,9,0},
{4,0,6,0,0,8,0,0,5},
{6,0,0,0,4,0,3,0,0},
{9,0,0,0,1,0,7,0,0}};
*/
int
i,j,n,en,flag,y,k=0,x,qu,p,q;
Node
b[70];
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(!a[i][j])
{
b[k].line=i;
b[k].row=j;
b[k].num=0;
k+=1;
}
}
}
en=k;
/*從b[0]開始試,若b[k].num>9,則k-1,否則k+1*/
for(k=0;k<en;)
{
++b[k].num;
i=b[k].line;
j=b[k].row;
a[i][j]=b[k].num;
n=0;
while(n<9&&b[k].num<=9)
{
if(n==i)
{
for(y=0;y<9;y++)
{
if(y==j)
continue;
if(a[n][y]==a[i][j])
flag=1;
}
}
else
if(n==j)
{
for(y=0;y<9;y++)
{
if(y==i)
continue;
if(a[y][n]==a[i][j])
flag=1;
}
}
/*判斷同一塊中有沒有相同值*/
qu=3*(i/3)+j/3;
switch(qu)
{
case
0:x=0;
y=0;
break;
case
1:x=0;
y=3;
break;
case
2:x=0;
y=6;
break;
case
3:x=3;
y=0;
break;
case
4:x=3;
y=3;
break;
case
5:x=3;
y=6;
break;
case
6:x=6;
y=0;
break;
case
7:x=6;
y=3;
break;
default
:x=6;
y=6;
break;
}
p=x;
q=y;
for(;x<p+3;x++)
{
for(;y<q+3;y++)
{
if(x==i&&y==j)
continue;
if(a[x][y]==a[i][j])
{
flag=1;
break;
}
}
if(flag==1)
break;
}
if(flag==1)
{
a[i][j]=++b[k].num;
flag=0;
n=0;
continue;
}
n++;
}
if(b[k].num>9)
{
a[i][j]=b[k].num=0;
k--;
if(k<0)
{
printf("error!\r\n");
return
-1;
}
}
else
k++;
}
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d",a[i][j]);
}
printf("\r\n");
}
return
1;
}
㈦ 求一道例題的c語言解答,用c語言編程,謝謝了 9x9表格填空 要求每一行每一豎都包含有1-9 九個數字條件如圖
#include <stdio.h>
void print(int a[9][9]) /*格式化輸出數獨*/
{int i,j;
for(i=0;i<9;i++)
{for(j=0;j<9;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
void ini_logo(int logo[10][9][9],int arr[9][9]) /*初始化標志數組*/
{int i,j,k,p,r,s,t;
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
for(k=1;k<=9;++k)logo[k][i][j]=1;
for(i=0;i<9;++i)
for(j=0;j<9;++j)
if(arr[i][j]!=0)
{p=arr[i][j];
for(r=0;r<9;++r)
{logo[p][i][r]=1;logo[p][r][j]=1;}
for(s=(i/3)*3;s<(i/3)*3+3;++s)
for(t=(j/3)*3;t<(j/3)*3+3;++t)
logo[p][s][t]=1;
}
}
int add(int arr[9][9],int logo[10][9][9],int m,int n,int k) /*arr[m][n]插入數字,修改arr,logo數組*/
{int i,s,p,t;
arr[m][n]=k;
for(p=1;p<=9;++p)
logo[p][m][n]=1;
for(i=0;i<9;++i)
{logo[k][m][i]=1;
logo[k][i][n]=1;
}
for(s=(m/3)*3;s<(m/3)*3+3;++s)
for(t=(n/3)*3;t<含兆陪(n/3)*3+3;++t)
logo[k][s][t]=1;
}
int check(int logo[10][9][9],int arr[9][9]) /*檢談蠢測行列和小九宮格*/
{int i,j,k,p,q,r,s,t,m,n,tag=0; /*tag標志本輪是否修改*/
for(k=1;k<=9;++k)
{for(i=0;i<9;++i)
{p=0;q=0;
for(j=0;j<9;++j)
{if(logo[k][i][j]==0){r=j;p++;} /*檢測行*/
if(logo[k][j][i]==0){s=j;q++;} /*檢測列*/
}
if(p==1){tag=1;add(arr,logo,i,r,k);}
if(q==1){tag=1;add(arr,logo,s,i,k);} /*滿足一個添加的條件,修改arr,logo數組和標志tag*/
}
for(i=0;i<9;i=i+3) /*檢測小九宮格*/
for(j=0;j<9;j=j+3)
{t=0;
for(m=i;m<i+3;++m)
for(n=j;n<j+3;++n)
if(logo[k][m][n]==0){q=m;s=n;t++;}
if(t==1){tag=1;add(arr,logo,q,s,k);}
}
}
return(tag);
}
main()
{
int arr[9][9]={ /*!!!!數獨初始化,其中0表示數字未給出,這里修改成你上面圖中猜亮的數字*/
0,0,0,0,0,0,0,0,0,
0,2,3,0,0,0,7,8,0,
1,0,0,4,0,6,0,0,9,
4,0,0,0,5,0,0,0,1,
9,0,0,0,0,0,0,0,6,
0,6,0,0,0,0,0,9,0,
0,0,5,0,0,0,8,0,0,
0,0,0,3,0,1,0,0,0,
0,0,0,0,9,0,0,0,0
},
logo[10][9][9]={0},i,j;
ini_logo(logo,arr);
while(check(logo,arr)==1) /*當一輪沒有檢測出,即結束*/
{}
print(arr);
}
㈧ 求解數獨題,用C語言實現
回溯法(探索與回溯法)是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術為回溯法,而滿足回溯條件的某個狀態的點稱為「回溯點」。
#include<stdio.h>
intmap[9][9];
boolisPlace(intcount){
introw=count/9;
intcol=count%9;
intj;
//同一行
for(j=0;j<9;++j){
if(map[row][j]==map[row][col]&&j!=col){
returnfalse;
}
}
//同一列
for(j=0;j<9;++j){
if(map[j][col]==map[row][col]&&j!=row){
returnfalse;
}
}
//同一小格
inttempRow=row/3*3;
inttempCol=col/3*3;
for(j=tempRow;j<tempRow+3;++j){
for(intk=tempCol;k<tempCol+3;++k){
if(map[j][k]==map[row][col]&&j!=row&&k!=col){
returnfalse;
}
}
}
returntrue;
}
voidbacktrace(intcount){
if(count==81){
for(inti=0;i<9;++i){
for(intj=0;j<9;++j){
printf("%d",map[i][j]);
}
printf("\n");
}
return;
}
introw=count/9;
intcol=count%9;
if(map[row][col]==0){
for(inti=1;i<=9;++i){
map[row][col]=i;//賦值
if(isPlace(count)){//可以放
backtrace(count+1);//進入下一層
}
}
map[row][col]=0;//回溯
}else{
backtrace(count+1);
}
}
intmain()
{
charc;
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
scanf("%c",&c);
if(c=='.')map[i][j]=0;
elsemap[i][j]=c-'0';
}
scanf("%c",&c);//接收換行符
}
backtrace(0);
return0;
}
㈨ c語言 輸入九個數,生成一個完整數獨9*9
#include<stdio.h>
intresult=0;//結果數
intmain()
{
inta[9][9];
voidSudoku(inta[9][9],intn);
printf("請輸入數獨中的原始數據,沒有數據的用0代替。 ");
for(inti=0;i<9;i++)
{
printf("請輸入第%d行的9個數:",i+1);
for(intj=0;j<9;j++)
scanf("%d",&a[i][j]);
}
printf("數獨的解為: ");
Sudoku(a,0);
if(result==0)
printf("此數獨無解!");
return0;
}
//輸出可行的解
voidprint(inta[9][9])
{
result++;
printf("第%d個填法為: ",result);
for(inti=0;i<9;i++)
{
for(intj=0;j<9;j++)
{
printf("%d",a[i][j]);
if((j==2)||(j==5))
printf("");
}
printf(" ");
if((i==2)||(i==5))
printf(" ");
}
printf(" ");
}
//判斷是否可以將第i行、第j列的數設為k
boolcheck(inta[9][9],inti,intj,intk)
{
intm,n;
//判斷行
for(n=0;n<9;n++)
{
if(a[i][n]==k)
returnfalse;
}
//判斷列
for(m=0;m<9;m++)
{
if(a[m][j]==k)
returnfalse;
}
//判斷所在小九宮格
intt1=(i/3)*3,t2=(j/3)*3;
for(m=t1;m<t1+3;m++)
{
for(n=t2;n<t2+3;n++)
{
if(a[m][n]==k)
returnfalse;
}
}
//可行,返回true
returntrue;
}
//數獨求解函數
voidSudoku(inta[9][9],intn)
{
inttemp[9][9];
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
temp[i][j]=a[i][j];
}
i=n/9;j=n%9;//求出第n個數的行數和列數
if(a[i][j]!=0)//已經有原始數據
{
if(n==80)//是最後一個格子,輸出可行解
print(temp);
else//不是最後一個格子,求下一個格子
Sudoku(temp,n+1);
}
else//沒有數據
{
for(intk=1;k<=9;k++)
{
boolflag=check(temp,i,j,k);
if(flag)//第i行、第j列可以是k
{
temp[i][j]=k;//設為k
if(n==80)
print(temp);
else
Sudoku(temp,n+1);
temp[i][j]=0;//恢復為0,判斷下一個k
}
}
}
}
㈩ 數獨 演算法 C語言 代碼
一、步驟:
1.對每一個空格,根據規則推斷它可能填入的數字,並存儲它的所有可能值;
2.根據可能值的個數,確定填寫的順序。比如說,有些空格只有一種可能,那必然是正確的結果,首先填入。
3.將所有隻有一種可能的空格填寫完畢以後,回到步驟1,重新確定剩下空格的可能值;
4.當沒有隻有一種可能的空格時(即每個空格都有兩種以上可能),按照可能值個數從小到大的順序,使用深度(廣度)優先搜索,完成剩下空格。
二、常式:
#include<windows.h>
#include<stdio.h>
#include<time.h>
charsd[81];
boolisok=false;
//顯示數獨
voidshow()
{
if(isok)puts("求解完成");
elseputs("初始化完成");
for(inti=0;i<81;i++)
{
putchar(sd[i]+'0');
if((i+1)%9==0)putchar(' ');
}
putchar(' ');
}
//讀取數獨
boolInit()
{
FILE*fp=fopen("in.txt","rb");
if(fp==NULL)returnfalse;
fread(sd,81,1,fp);
fclose(fp);
for(inti=0;i<81;i++)
{
if(sd[i]>='1'&&sd[i]<='9')sd[i]-='0';
elsesd[i]=0;
}
show();
returntrue;
}
//遞歸解決數獨
voidforce(intk)
{
if(isok)return;
if(!sd[k])
{
for(intm=1;m<=9;m++)
{
boolmm=true;
for(intn=0;n<9;n++)
{
if((m==sd[k/27*27+(k%9/3)*3+n+n/3*6])||(m==sd[9*n+k%9])||(m==sd[k/9*9+n]))
{
mm=false;
break;
}
}
if(mm)
{
sd[k]=m;
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}
sd[k]=0;
}
else
{
if(k==80)
{
isok=true;
show();
return;
}
force(k+1);
}
}
intmain()
{
system("CLS");
if(Init())
{
doublestart=clock();
force(0);
printf("耗時%.0fms",clock()-start);
}
elseputs("初始化錯誤");
getchar();
}