C語言中的數獨問題(回溯)

2021-08-10 06:00:27 字數 1867 閱讀 4171

描述:

數獨遊戲規則

在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

1.這道題的輸入很奇怪。如果一開始把資料輸入到int型陣列中,陣列中就會有9個9位的數,而不是81個1位的數。所以只能把資料輸入到字元型陣列中,這樣才能保證每次只讀取乙個數字。

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 的數字,如果與盤面衝突就換成下乙個數字,如果不衝突就去往第三個空格,以此類推 當最...