1樓:「已登出」
哈哈手工只能解出個確定5
(有細心的小夥伴發現第四行第乙個2也可以確定)
然後試的話大概有8種吧
話說,玩數獨要跟喜歡的人一起玩才有樂趣
我就不乙個個試了(主要手機很麻煩)
直接下個編譯器白嫖老哥的程式
輸入框也不做乙個,漬漬
這個就是你想要的結果了
附上老哥的程式
#include
#include
#define BOOL int
#define FALSE 1
#define TRUE 0
typedef struct node
int col;
int row;
int value[10];
} Node;
int findvalue(int sudoku[9][9], Node * node);
BOOL general_inspection(int sudoku[9][9]);
int blank_num(int sudoku[9][9]);
Node * mem_alloc(int num_of_empty);
void trace(int sudoku[9][9], Node * node_stack, int num_of_empty);
void print_sudoku(int sudoku[9][9]);
int main(void)
int sudoku[9][9] = ,
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}
int num_of_empty;
//為回溯棧分配空間
Node * node_stack;
if(general_inspection(sudoku))
printf("此數獨存在錯誤!請檢查\n");
print_sudoku(sudoku);
return 0;
num_of_empty = blank_num(sudoku);
node_stack = mem_alloc(num_of_empty);
trace(sudoku, node_stack, num_of_empty);
print_sudoku(sudoku);
return 0;
BOOL general_inspection(int sudoku[9][9])
int temp[10] = ;
int i, 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
return FALSE;
檢查所在列
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
return FALSE;
檢查所在九宮格
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
return FALSE;
return TRUE;
int blank_num(int sudoku[9][9])
//計算所給數獨中待填入的空白數
int i, j, num = 0;
for(i=0; i<9; i++)
for(j=0; j<9; j++)
if(sudoku[i][j]==0)
num++;
return num;
Node * mem_alloc(int num_of_empty)
Node * node_stack = (Node *)malloc(sizeof(struct node) * num_of_empty);
if(node_stack==NULL)
printf("記憶體分配失敗!\n");
exit(1);
return node_stack;
void trace(int sudoku[9][9], Node * node_stack, int num_of_empty)
int i, 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("此數獨無解!\n");
free(node_stack); //為啥這裡一釋放記憶體,就彈出debug assertion failed視窗啊!
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;
int findvalue(int sudoku[9][9], Node * node)
int m, 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
return m;
void print_sudoku(int sudoku[9][9])
//列印數獨
int i, j;
for(i=0; i<9; i++)
for(j=0; j<9; j++)
printf("%2d ", sudoku[i][j]);
printf("\n");
出處https://www.
請問數獨解到這裡之後怎麼推?
這裡發現乙個待定數佔位形唯一矩形 它的邏輯是這樣的,因為數獨只有乙個唯一解,所以在D79中一定有乙個填5,所以F9不能填5 還有乙個區塊排除法 因為宮3內只有C79能填5,所以C12不能填5乙個顯性數對 這裡還有乙個不規則匹配法 也可以看成一條鏈 最後就是乙個BUG 根據BUG的邏輯,唯一乙個三值格...
小白玩數獨求解,已上圖?
Kyu 最笨的辦法就是將所有未知的空都標記有可能的數,標記好所有的空,會發現有的空是只有乙個備選答案的,那這個數字就是答案,新答案填好後可以把橫縱行的這個數字刪去,此時會在別的空裡出現新的只有乙個備選答案的空 以此類推,我回答的有一些繁瑣,而且這個辦法比較笨。最先開始可以用這個慢方法練習,題做得多自...
不用猜的如何推算出這道數獨?
JohnTim2018 按某些評測軟體,難度大於4級的就需要用到反證法,這不是題主不願涉及的 猜 而是一整套高難的推理。不夠4級的數獨遊戲,完全可以按照題主熟悉的方法推算出來。而來到4級以上,怎麼辦呢?猜 嗎?或者說 試數 大約在幾十年前的歐洲,就有人遇到這樣的困惑,一開始肯定有猜或試數的成分,即暴...