描述:1.這道題的輸入很奇怪。如果一開始把資料輸入到int型陣列中,陣列中就會有9個9位的數,而不是81個1位的數。所以只能把資料輸入到字元型陣列中,這樣才能保證每次只讀取乙個數字。數獨遊戲規則
在9階方陣中,包含了81個小格(九列九行),其中又再分成九個小正方形(稱為宮),每宮有九小格。
遊戲剛開始時,盤面上有些小格已經填了數字(稱為初盤),遊戲者要在空白的小格中填入1到9的數字,
使得最後每行、每列、每宮都不出現重複的數字,而且每乙個遊戲都只有乙個唯一的解答(稱為終盤)。
輸入:
乙個9*9的矩陣,0表示該位置是空白。
輸出:
乙個9*9的矩陣,格式與輸入類似。
輸入樣例:
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
輸出樣例:
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
2.用回溯法窮舉二維陣列時,不需要宣告兩個變數,只需要乙個變數經過/和%運算就可以確定行和列。
3.在for迴圈後新增shudu[x][y]的必要。
和普通窮舉不同,普通窮舉時不需要考慮不同位置間數的關係;
和8皇后問題也不同,8皇后問題只需要考慮新加入的數和其左邊其上邊的數的關係;
數獨問題中,每乙個數和其前後左右的數都有關係。
所以乙個位置在當前情況下取不到值時,應該在回溯前把該位置的值返回0,這樣才不會影響其他數的取值,
相當於開始討論一種新的情況。
如果不返回0,在討論前面位置的其他情況時仍然會受這個位置的9的影響。
#include
int shudu[9][9];
char temp[9][10];
void search(int m);
void output();
int check(int m);
int main()}}
search(0);
return
0;}
void search(int m)
if(m==81)
if(m>=0&&m<=80)
if(shudu[x][y]==0)//討論空位(0)的可能取值
shudu[x][y]=0;
/*和普通窮舉不同,普通窮舉時不需要考慮不同位置間數的關係;
和8皇后問題也不同,8皇后問題只需要考慮新加入的數和其左邊其上邊的數的關係;
數獨問題中,每乙個數和其前後左右的數都有關係。
所以乙個位置在當前情況下取不到值時,應該在回溯前把該位置的值返回0,這樣才不會影響其他數的取值,
相當於開始討論一種新的情況。
如果不返回0,在討論前面位置的其他情況時仍然會受這個位置的9的影響。*/ }}
}int check(int n)
for(j=0;j<=8;j++)//檢查每行中不出現重複數字
int l=(x/3)*3,c=(y/3)*3;
for(i=l;i<=l+2;i++)
}return1;}
void output()//輸出
printf("\n");
}}
C 解決數獨問題(回溯)
參考鏈結來自於 輸入乙個數獨作為9 9的陣列,例如輸入乙個測試資料map 9 9 為 0 9 0 0 0 0 0 6 0 8 0 1 0 0 0 5 0 9 0 5 0 3 0 4 0 7 0 0 0 8 0 7 0 9 0 0 0 0 0 9 0 8 0 0 0 0 0 6 0 2 0 7 0 0...
數獨問題(DFS 回溯)
數獨遊戲的規則是這樣的 在乙個9x9的方格中,你需要把數字1 9填寫到空格當中,並且使方格的每一行和每一列中都包含1 9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1 9這九個數字。比如有這樣乙個題,大家可以仔細觀察一下,在這裡面每行 每列,以及每個3x3的方格都包含1 9...
回溯演算法python 數獨問題 回溯演算法經典例題
之前我們已經簡單地說明了怎樣用回溯演算法解決數獨的問題,思路如下 從第乙個空格開始。依次嘗試 1 到 9 的數字,如果數字與盤面衝突就換成下乙個數字,如果不衝突就去往第二個空格 在第二個空格,同樣依次嘗試 1 到 9 的數字,如果與盤面衝突就換成下乙個數字,如果不衝突就去往第三個空格,以此類推 當最...