這道數獨怎麼解啊?求解?

時間 2021-06-07 20:02:28

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級以上,怎麼辦呢?猜 嗎?或者說 試數 大約在幾十年前的歐洲,就有人遇到這樣的困惑,一開始肯定有猜或試數的成分,即暴...