Sudoku Killer (搜尋求數獨)
Sudoku Killer
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 9 Accepted Submission(s) : 4
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
自從2006年3月10日至11日的首屆數獨世界錦標賽以後,數獨這項遊戲越來越受到人們的喜愛和重視。 據說,在2008北京奧運會上,會將數獨列為一個單獨的專案進行比賽,冠軍將有可能獲得的一份巨大的獎品———HDU免費七日遊外加lcy親筆簽名以及同hdu acm team合影留念的機會。 所以全球人民前仆後繼,為了獎品日夜訓練茶飯不思。當然也包括初學者linle,不過他太笨了又沒有多少耐性,只能做做最最基本的數獨題,不過他還是想得到那些獎品,你能幫幫他嗎?你只要把答案告訴他就可以,不用教他是怎麼做的。 數獨遊戲的規則是這樣的:在一個9x9的方格中,你需要把數字1-9填寫到空格當中,並且使方格的每一行和每一列中都包含1-9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1-9這九個數字。比如有這樣一個題,大家可以仔細觀察一下,在這裡面每行、每列,以及每個3x3的方格都包含1-9這九個數字。 例題:
Input
本題包含多組測試,每組之間由一個空行隔開。每組測試會給你一個 9*9 的矩陣,同一行相鄰的兩個元素用一個空格分開。其中1-9代表該位置的已經填好的數,問號(?)表示需要你填的數。
Output
對於每組測試,請輸出它的解,同一行相鄰的兩個數用一個空格分開。兩組解之間要一個空行。 對於每組測試資料保證它有且只有一個解。
Sample Input
7 1 2 ? 6 ? 3 5 8 ? 6 5 2 ? 7 1 ? 4 ? ? 8 5 1 3 6 7 2 9 2 4 ? 5 6 ? 3 7 5 ? 6 ? ? ? 2 4 1 1 ? 3 7 2 ? 9 ? 5 ? ? 1 9 7 5 4 8 6 6 ? 7 8 3 ? 5 1 9 8 5 9 ? 4 ? ? 2 3
Sample Output
7 1 2 4 6 9 3 5 8 3 6 5 2 8 7 1 9 4 4 9 8 5 1 3 6 7 2 9 2 4 1 5 6 8 3 7 5 7 6 3 9 8 2 4 1 1 8 3 7 2 4 9 6 5 2 3 1 9 7 5 4 8 6 6 4 7 8 3 2 5 1 9 8 5 9 6 4 1 7 2 3
搜尋題集裡面最有用的一道題,玩數獨寫完可以做個介面程式移植。比較水,開個陣列暴力搜尋就好
# include <iostream> # include <cstring> # include <cstdio> using namespace std; const int maxn = 15; int m[maxn][maxn], sum; struct node { int x, y; }s[200];//開一個結構體記錄要填的數的下標 bool check(int c, int flag) { for(int i = 0; i < 9; i++) if(m[s[flag].x][i] == c || m[i][s[flag].y] == c)//如果行和列有一個放了c return false; int x = s[flag].x / 3 * 3;//判斷相鄰9格的數字 int y = s[flag].y / 3 * 3; for(int i = 0; i < 3; i++) for(int j = 0; j < 3; j++) if(m[x + i][y + j] == c ) return false; return true; } void dfs(int flag) { if(flag == sum)//如果形成了表就結束 { for(int i = 0; i< 9; i++) for(int j = 0; j< 9; j++) j != 8? cout << m[i][j] << " ": cout << m[i][j] << endl; return ; } for(int i = 1; i <= 9; i++) if(check(i, flag))//檢查該位置填沒填過,i是填的數,flag是s的下標 { m[s[flag].x][s[flag].y] = i; dfs(flag + 1); m[s[flag].x][s[flag].y] = 0; } } int main(int argc, char *argv[]) { char ch; int k = 0; while(cin >> ch) { sum = 0; if(ch == '?') { m[0][0] = 0; s[sum].x = 0; s[sum++].y = 0; } else { m[0][0] = ch - '0'; } for(int i = 0; i < 9; i++) for(int j = 0; j < 9; j++) { if(i == 0 && j == 0) continue; cin >> ch; if(ch == '?') { m[i][j] = 0; s[sum].x = i; s[sum++].y = j; } else { m[i][j] = ch - '0'; } } if(k++) cout <<endl; dfs(0); } return 0; }