㈠ 用c語言如何隨機生成一個數獨
數獨生成演算法?這個還真不好搞,不過我當初寫數獨游戲的時候隨便搗鼓出來過一個,你自己去改改吧,至於這個演算法能不能生成所有的數獨,我還真沒論證過。
原理:對一個給出的數獨棋盤的所有行或列交換給出的兩個數X、Y,數組仍滿足數獨規則。如給出1、2,則對所有列交換1、2的位置,數組仍滿足數獨規則。
由於對棋盤的演進是隨機的,所以相當於隨機生成數獨棋盤啦。每次演進的次數最好大一點,10次以上吧,以保證每個數都被換過位置。
具體代碼就不用我寫了吧,嘎嘎……
㈡ c語言 隨機生成數獨
check()函數的do...while循環有深層次邏輯錯誤:當if((rawflag==1)||(colflag==1))為「真」後的某種情況就出現rawflag和colflag不可能同時出現0而導致死循環。寫法上if((rawflag==1)||(colflag==1))
{
a[raw][col]=rand()%9+1;
}
else
break;
}
和while((rawflag==1)||(colflag==1));就不協調,好像把if語句刪除,把它的體a[raw][col]=rand()%9+1;直接寫在do{後才在邏輯上清晰……
㈢ c語言 編程 數獨
當年我們做大程的時候本來也想做數獨來著,後來時間不夠沒做成.不知道專業人士怎麼編的,只能提供一點當時的思路給你,
1.9*9個格子對應一個數組A,數組的第一個值從0到9表示其中填的數字,0就是不填,另一個值表示它在桌面上的位置就是坐標
2.需要10張圖片,空白和9個數字
3.通過對滑鼠點擊的反應改變格子數組A的值,且將相應圖片覆蓋在相應坐標上
4.事先輸入若干組數組A的值(每組81個數),作為題庫
5.進行游戲時隨機抽取題庫中的一組,再隨機抽取若干格子顯示出來,其他留白.
6.填完後用三個循環判斷下每行每列每塊是否有相同的數字,沒有則通過.
具體編按鈕、放圖、滑鼠點擊響應等各種問題查一下書,有很多書上有很多教的這種一小段一小段的程序源代碼,直接抄下就行了。
加油^^
㈣ 用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
#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++數獨游戲的原代碼!
我迅賣這個很好
#include<stdio.h>耐昌局
#include<time.h>
#include<stdlib.h>
int f(int i,int j,int s);
int n[9][9];
int line[9][9],column[9][9],block[9][9];
char youxi[9][9];
int m[9][9];
int l[9][9],c[9][9],v[9][9];
void main()
{
int x=81,a,b;char w;
while(1)
{
printf("<<<<<歡迎進入數獨游戲>>>>>\n");
printf("< >\n");
printf("< 進入游戲請按a >\n");
printf("< 退出遊戲請按e >\n");
printf("< 了解規則請按h >\n");
printf("< >\n");
printf("<<<<<<<<<<<<>>>>>>>>>>>>>>\n");
char temp;
scanf("%c",&w);
temp=w;
if(temp=='h') {
printf("** 數獨游戲在9x9的方格內進行,分為3x3的小方格昌讓,被稱為區. **\n");
printf("** 數獨游戲首先從已經填入數字的格子開始. **\n");
printf("** 用1至9之間的數字填滿空格,一個格子只能填入一個數字. **\n");
printf("** 每個數字在每一行只能出現一次; **\n");
printf("** 每個數字在每一列只能出現一次; **\n");
printf("** 每個數字在每一區只能出現一次; **\n");
printf("** 總結這些規則,即每個數字在每一行,每一列和每一區只能出現一次.**\n");}
if(temp=='a') break;
if(temp=='e') exit(1);
}
int i,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
n[i][j]=0;
line[i][j]=0;
column[i][j]=0;
m[i][j]=0;
l[i][j]=0;
c[i][j]=0;
v[i][j]=0;
block[i][j]=0;
}
srand((unsigned)time(NULL));
f(0,0,rand()%9+1);
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{ int y;
y=rand()%9;
if(y<=3)
{
m[i][j]=n[i][j];
}
}
}
while(1)
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
{
if(m[i][j]!=0) {youxi[i][j]=m[i][j]+48;
l[i][m[i][j]-1]=1;
c[j][m[i][j]-1]=1;
v[i/3*3+j/3][m[i][j]-1]=1;}
}
}
printf("┏━┯━┯━┳━┯━┯━┳━┯━┯━┓\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[0][0],youxi[0][1],youxi[0][2],youxi[0][3],youxi[0][4],youxi[0][5],youxi[0][6],youxi[0][7],youxi[0][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[1][0],youxi[1][1],youxi[1][2],youxi[1][3],youxi[1][4],youxi[1][5],youxi[1][6],youxi[1][7],youxi[1][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[2][0],youxi[2][1],youxi[2][2],youxi[2][3],youxi[2][4],youxi[2][5],youxi[2][6],youxi[2][7],youxi[2][8]);
printf("┣━┿━┿━╋━┿━┿━╋━┿━┿━┫\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[3][0],youxi[3][1],youxi[3][2],youxi[3][3],youxi[3][4],youxi[3][5],youxi[3][6],youxi[3][7],youxi[3][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[4][0],youxi[4][1],youxi[4][2],youxi[4][3],youxi[4][4],youxi[4][5],youxi[4][6],youxi[4][7],youxi[4][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[5][0],youxi[5][1],youxi[5][2],youxi[5][3],youxi[5][4],youxi[5][5],youxi[5][6],youxi[5][7],youxi[5][8]);
printf("┣━┿━┿━╋━┿━┿━╋━┿━┿━┫\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[6][0],youxi[6][1],youxi[6][2],youxi[6][3],youxi[6][4],youxi[6][5],youxi[6][6],youxi[6][7],youxi[6][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[7][0],youxi[7][1],youxi[7][2],youxi[7][3],youxi[7][4],youxi[7][5],youxi[7][6],youxi[7][7],youxi[7][8]);
printf("┠—┼—┼—╂—┼—┼—╂—┼—┼—┨\n");
printf("┃%c │%c │%c ┃%c │%c │%c ┃%c │%c │%c ┃\n",youxi[8][0],youxi[8][1],youxi[8][2],youxi[8][3],youxi[8][4],youxi[8][5],youxi[8][6],youxi[8][7],youxi[8][8]);
printf("┗━┷━┷━┻━┷━┷━┻━┷━┷━┛\n");
loop: printf("請輸入填寫數字的坐標(1-9)\n");
scanf("%d%d",&a,&b);
if(a>9||b>9){printf("plaese intput 1-9\n");goto loop;}
if(m[a-1][b-1]!=0) printf("該空格內有數字\n%d\n",m[a-1][b-1]);
else
{
printf("請填入相應數字\n");
scanf("%d",&m[a-1][b-1]);
if(!l[a-1][m[a-1][b-1]-1]&&!c[b-1][m[a-1][b-1]-1]&&!v[(a-1)/3*3+(b-1)/3][m[a-1][b-1]-1] ) continue;
else
{
m[a-1][b-1]=0;
printf("填寫錯誤\n");
printf("顯示答案鍵入r\n");exit(0);
if(getchar()=='r')
{
for (i = 0; i < 9; i++)
{
for (j = 0; j < 9; j++)
m[i][j]=n[i][j];
}
}
}
}
}
}
int f(int i,int j,int s)
{
int k;
for (k = s - 1; k < 9; k++)
{
if (!line[i][k] && !column[j][k] && !block[i/3*3+j/3][k])
{
n[i][j] = k + 1;
line[i][k] = 1;
column[j][k] = 1;
block[i/3*3+j/3][k] = 1;
if (i == 8 && j == 8)
return 1;
if (j == 8)
{
j = 0;
i++;
}
else
j++;
f(i, j, 1);
return 1;
}
if (k == 8) //huisu
{
do
{
if (j == 0)
{
j = 8;
i--;
}
else
j--;
line[i][n[i][j]-1] = 0;
column[j][n[i][j]-1] = 0;
block[i/3*3+j/3][n[i][j]-1] = 0;
}
while (n[i][j] == 9);
f(i, j, n[i][j] + 1);
return 1;
}
}
return 1;
}
㈦ C#數獨我有設計思路,但不會寫
提問者真的很謙虛,已經寫了這么多設計思路了還說自己不會寫。根據提問者和前幾位問答著的互動可見,提問者不是不會寫,而是非常會寫,而且寫得非常好。是一個很精通的老師。建議提問者自行開辦一個實體培訓機構更好,將自己長項教授給有興趣的人們。
數獨是一種運用紙、筆進行演算的邏輯數學游戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個粗線宮(3×3)內的數字均含1-9,不重復。數獨盤面是個九宮,每一宮又分為九個小格。在這八十一格中給出一定的已知數字和解題條件,利用邏輯和推理,在其他的空格上填入1-9的數字。使1-9每個數字在每一行、每一列和每一宮中都只出現一次,所以又稱「九宮格」。數獨起源於18世紀初瑞士數學家歐拉等人研究的拉丁方陣。19世紀80年代,一位美國的退休建築師格昂斯根據這種拉丁方陣發明了一種填數趣味游戲,這就是數獨的雛形。20世紀70年代,人們在美國紐約的一本益智雜志《Math Puzzles and Logic Problems》上發現了這個游戲,當時被稱為填數字,這也是目前公認的數獨最早的見報版本。1984年一位日本學者將其介紹到了日本,發表在Nikoli公司的一本游戲雜志上,當時起名為「數字獨身限」,後來就改名為「數獨」,其中「數」是數字的意思,「獨」是唯一的意思。後來一位前任香港高等法院的紐西蘭籍法官高樂德在1997年3月到日本東京旅遊時,無意中發現了。他首先在英國的《泰晤士報》上發表,不久其他報紙也發表,很快便風靡全英國,之後他用了6年時間編寫了電腦程序,並將它放在網站上(這個網站也就是著名的數獨玩家論壇),後來因一些原因,網站被關閉,幸好數獨大師Glenn Fowler恢復了數據,玩家論壇有了新處所。在90年代國內就有部分的益智類書籍開始刊登,南海出版社在2005年出版了《數獨1-2》,隨後日本著名數獨制題人西尾徹也的《數獨挑戰》也由遼寧教育出版社出版。《北京晚報》、《揚子晚報》、《羊城晚報》、《新民晚報》、《成都商報》等等報紙媒體也先後刊登了數獨游戲。
解題手法:
一、直觀法就是不做任何記號,直汪嘩接從數獨的盤勢觀察線索,推論答案的方法。
二、候選數法就是刪減等位群格位已出現的數字,將剩餘可填數字填入空格做為解題線索的參考,可填數字稱為候選數(Candidates,或稱備選數)。
三、排除法(摒除法)
摒除法:用數字去找單元內唯一可填空格,稱為摒除法,數字可填唯一空世陵橡格稱為排除法 (Hidden Single)。
根據不同的作用范圍,摒余解可分為下述三種:
數字可填唯一空格在「宮」單元稱為宮排除(Hidden Single in Box),也稱宮摒除法。
數字可填唯一空格在「行」單元稱為行排除法(Hidden Single in Row),也稱行摒除法。
數字可填唯一空格在「列」單元稱為列排除法(Hidden Single in Column),也稱列摒除法。
四、唯一餘數法:用格位去找唯一可填數字,稱為余數法,格位唯一可填數字稱為唯余解。
余數法是刪減等位群格位(Peer)已出現的數搜旁字的方法,每一格位的等位群格位有 20 個,如圖七所示。
五、進階解法:是在補基本解法之不足,所以又稱輔助解法。
進階解法包括:區塊摒除法(Locked Candidates)、數組(Subset/Tuple)、二鏈列(X-Wing)、唯一矩形(Unique Rectangle)、全雙值格致死解法(Bivalue Universal Grave)、同數鏈(X-Chain)、異數鏈(Multidigit Chain)及其他數鏈的高級技巧等等。已發展出來的方法有近百種之多。
其中前三種加上基礎解法為一般數獨書中介紹並使用的方法,同時也是大部分人可以理解並掌握的數獨解題技法。
通過基礎解法出數只需一種解法,摒除法或唯余法,超出此范圍而需要施加進階解法時,解題點需要進階解法協助基礎解法來滿足隱性唯一或顯性唯一才能出數,該解題點的解法需要多個步驟協力完成,因此稱做組合解法。
解題必須以邏輯為依歸,提倡數獨的本意。
六、區塊摒除法:區塊摒除法包括宮區塊摒除法(Pointing)與行列區塊摒除法。
在基礎題里,利用區塊摒除可以替代一些基礎解法的觀察,或輔助基礎解法尋找焦點。
在非基礎題里,區塊可以隱藏任何其他結構,簡單的可以把基礎解法隱藏起來,難的可以隱藏數對等等其他進階技巧。
七、數對法:當一個單元(行、列、宮)的某兩個數字僅可能在某兩格時,我們稱這兩個格為這兩個數的數對(Pairs)。
數對出現在宮稱為宮數對;數對出現在行列成為行列數對。
用候選數法的觀點去看,數對有兩種,一種是在同單元內其中兩格有相同的雙候選數,一看就明白,因此稱為顯性數對(Naked Pair),另一種是,同單元內有兩個候選數佔用了相同的兩格,該兩格因為還有其它候選數很難辨認,因此稱為隱性數對(Hidden Pair)。
㈧ 如何用C++編寫簡單的數獨程序
寫了個C語言的,供樓主參考:難度可以通過int leave[3]={45,54,63};調整
/*******************************************************************************
suudookuu.c
*******************************************************************************/
#include <stdio.h>
#include <time.h>
int Sudoku[9][9]={1,2,3,4,5,6,7,8,9,
4,5,6,7,8,9,1,2,3,
7,8,9,1,2,3,4,5,6,
2,3,1,5,6,7,8,9,4,
5,6,4,8,9,1,2,3,7,
8,9,7,2,3,4,5,6,1,
3,1,2,6,4,8,9,7,5,
6,4,5,9,7,2,3,1,8,
9,7,8,3,1,5,6,4,2};
char level[][8]={"EASY","NORMAL","HARD"};
int nlevel;
void display();
void make_sudoku();
int verify(int,int,int);
void main()
{
int i,j;
int nLeft=81;
int xPos,yPos,num;
char msg[128];
char ch;
do
{
system("cls");
printf("Game Level :\n");
printf(" [0] Easy\n");
printf(" [1] Normal\n");
printf(" [2] Hard\n");
printf("\nYour choice:");
scanf("%d",&nlevel);
} while(nlevel<0||nlevel>2);
make_sudoku(nlevel);
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(Sudoku[i][j]) nLeft--;
strcpy(msg,"Good luch for you!");
while(nLeft)
{
system("cls");
printf("\nLevel: %s\n",level[nlevel]);
printf("\n%s\n\n",msg);
display();
printf("Input <x,y,num> :");
scanf("%d,%d,%d",&xPos,&yPos,&num);
if(xPos==0 && yPos==0) break;
if(verify(xPos, yPos, num))
{
strcpy(msg,"Come on,BABY!");
nLeft--;
}
else
{
strcpy(msg,"input error:please try again!");
}
}
if(nLeft==0) printf("\n\nCongratulation!You are the No.1!\n");
else printf("\n\nSee you next time!\n");
getch();
}
void display()
{
int i,j;
printf("\n y 1 2 3.4 5 6.7 8 9.\n");
printf("x ...................\n");
for(i=0;i<9;i++)
{
printf("%d .", i+1);
for(j=0;j<9;j++)
{
if(Sudoku[i][j]>0 && Sudoku[i][j]<10)
printf("%d", Sudoku[i][j]);
else
printf(" ");
if(j%3==2) printf(".");
else printf(" ");
}
printf("\n");
if(i%3==2) printf(". ...................\n");
}
}
void make_sudoku(int nLevel)
{
int i,j,n;
int t;
int leave[3]={45,54,63};
srand(time(NULL));
for(n=0;n<10;n++)
{
i = rand()%3 * 3 + rand()%3;
for(j=0;j<9;j++)
{
t = Sudoku[i][j];
Sudoku[i][j] = Sudoku[i/3*3][j];
Sudoku[i/3*3][j] = t;
}
i = rand()%3 * 3 + rand()%3;
for(j=0;j<9;j++)
{
t = Sudoku[j][i];
Sudoku[j][i] = Sudoku[j][i/3*3];
Sudoku[j][i/3*3] = t;
}
}
n=0;
while(n<leave[nLevel])
{
t = rand()%81;
i=t/9;
j=t%9;
if(Sudoku[i][j])
{
Sudoku[i][j]=0;
n++;
}
}
}
int verify(int x,int y,int n)
{
int i,j,p,q;
if(x<0||x>8||y<0||y>8||n<1||n>9||Sudoku[x][y]) return 0;
for(i=0;i<9;i++) if(i!=x && Sudoku[i][y] == n) return 0;
for(j=0;j<9;j++) if(j!=y && Sudoku[x][j] == n) return 0;
p=x/3*3;
q=y/3*3;
for(i=p;i<p+3;i++)
for(j=q;j<q+3;j++)
if((i!=x||j!=y) && Sudoku[i][j]==n) return 0;
Sudoku[x][y]=n;
return 1;
}
㈨ 基於SAT的數獨游戲求解程序,求C語言代碼
用0代表要填的數
#include <stdio.h>
#include <stdlib.h>
#define SIZE 9
#define get_low_bit(x) ((~x&(x-1))+1)
struct{
int left;
char num;
char try;
}board[SIZE][SIZE];
int bit2num(int bit)
{
switch(bit){
case 16:
case 256:
return 9;
基礎解法
排除法(摒除法)
摒除法:用數字去找單元內唯一可填空格,稱為摒除法,數字可填唯一空格稱為排除法 (Hidden Single)。
根據不同的作用范圍,摒余解可分為下述三種:
數字可填唯一空格在「宮」單元稱為宮排除(Hidden Single in Box),也稱宮摒除法。
數字可填唯一空格在「行」單元稱為行排除法(Hidden Single in Row),也稱行摒除法。
㈩ 數獨 演算法 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();
}