HDU1426 Sudoku Killer DFS
點擊打開鏈接
Sudoku Killer
?
Time Limit: 2000/1000 MS (Java/Others)????Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9634????Accepted Submission(s): 2887
?
?
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 3Sample 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 3Author
linle
Source
ACM暑期集訓隊練習賽(三)
Recommend
LL???|???We have carefully selected several similar problems for you:??1258?1045?1016?1010?2614
思路:
找到每個空位,從1到9嘗試一遍,不沖突就把這個數字填上,然后填下一個空位
重點:
判斷九宮格內的數字是否合法
int tmpx=(x/3)*3,tmpy=(y/3)*3; for(int i=tmpx;i<tmpx+3;++i){//判斷九宮格 for(int j=tmpy;j<tmpy+3;++j){ if(sd[i][j]==k)return false; } } #include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; P node[90]; int sd[10][10],f=0,cnt; bool jud(int x,int y,int k){for(int i=0;i<9;++i){//判斷行和列if(sd[i][y]==k)return false;if(sd[x][i]==k)return false;}int tmpx=(x/3)*3,tmpy=(y/3)*3;for(int i=tmpx;i<tmpx+3;++i){//判斷九宮格for(int j=tmpy;j<tmpy+3;++j){if(sd[i][j]==k)return false;}}return true; } void dfs(int n){if(f)return;if(n==cnt){f=1;for(int i=0;i<9;++i){for(int j=0;j<9;++j){printf("%d%c",sd[i][j],j==8?'\n':' ');}}return;}for(int i=1;i<=9;++i){if(jud(node[n].first,node[n].second,i)){sd[node[n].first][node[n].second]=i;dfs(n+1);}if(f)return;//找到結果,退出函數}sd[node[n].first][node[n].second]=0;//循環結束也沒有解,說明此狀態無解,退回0 } int main(){char s[5];int i,j;while(~scanf("%s",s)){//scanf自動忽略回車,所以不用處理數據之間的空行cnt=0;sd[0][0]=(s[0]=='?'?0:s[0]-'0');//處理第一行第一位for(i=1;i<9;++i){scanf("%s",s);sd[0][i]=(s[0]=='?'?0:s[0]-'0');//第一行后面八位}for(i=1;i<9;++i){for(j=0;j<9;++j){scanf("%s",s);sd[i][j]=(s[0]=='?'?0:s[0]-'0');//后面八行}}for(int i=0;i<9;++i){//記錄沒有填的位置for(int j=0;j<9;++j){if(!sd[i][j])node[cnt].first=i,node[cnt++].second=j;}}if(f)putchar('\n');//兩組解之間有空格f=0;dfs(0);} }?
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的HDU1426 Sudoku Killer DFS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU2553 N皇后 回溯法+打表
- 下一篇: HDU1010 Tempter of t