Sudoku Killer(HDU-1426)
Problem Description
自從2006年3月10日至11日的首屆數獨世界錦標賽以后,數獨這項游戲越來越受到人們的喜愛和重視。
據說,在2008北京奧運會上,會將數獨列為一個單獨的項目進行比賽,冠軍將有可能獲得的一份巨大的獎品———HDU免費七日游外加lcy親筆簽名以及同hdu acm team合影留念的機會。
所以全球人民前仆后繼,為了獎品日夜訓練茶飯不思。當然也包括初學者linle,不過他太笨了又沒有多少耐性,只能做做最最基本的數獨題,不過他還是想得到那些獎品,你能幫幫他嗎?你只要把答案告訴他就可以,不用教他是怎么做的。
數獨游戲的規則是這樣的:在一個9x9的方格中,你需要把數字1-9填寫到空格當中,并且使方格的每一行和每一列中都包含1-9這九個數字。同時還要保證,空格中用粗線劃分成9個3x3的方格也同時包含1-9這九個數字。
Input
本題包含多組測試,每組之間由一個空行隔開。每組測試會給你一個 9*9 的矩陣,同一行相鄰的兩個元素用一個空格分開。其中1-9代表該位置的已經填好的數,問號(?)表示需要你填的數。
Output
對于每組測試,請輸出它的解,同一行相鄰的兩個數用一個空格分開。兩組解之間要一個空行。<br>對于每組測試數據保證它有且只有一個解。
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
思路:行列判斷好解決,但區域判斷不好處理,使用dfs,先判斷行列,若行列成立再判斷區域。
Source Program
#include<bits/stdc++.h> using namespace std; int a[10][10]; int ans,tot,flag;struct pointer {int x;int y;int step; }save[1000];int dfs(int x,int y) {int i,j;if(flag==1)return 0;if(ans==(tot+1)){for(i=1;i<=9;i++){for(j=1;j<=9;j++){if(j<9)printf("%d ",a[i][j]);elseprintf("%d",a[i][j]);}cout<<endl;}flag=1;return 0;}int row[10],line[10];memset(row,0,sizeof(row));memset(line,0,sizeof(line));for(i=1;i<=9;i++){if(a[x][i]!=0)//判斷行row[a[x][i]]=1;if(a[i][y]!=0)//判斷列line[a[i][y]]=1;}int x1=(x/4)*4,y1=(y/4)*4,flag1=0,k,t;//for(i=1;i<=9;i++){if(row[i]&&line[i])continue; //如果行列成立,才往下flag1=0;for(k=x1;k<x1+3;k++)//判斷區域{for(t=y1;t<y1+3;t++)if(a[k][t]==i){flag1=1;break;}if(flag==1)break;}if(flag1==0){ans++;a[x][y]=i;dfs(save[ans].x,save[ans].y);a[x][y]=0;ans--;}}return 0; } int main() {int i,j;int k;while(1){k=0;flag=0;ans=1;//記錄找到第幾個?tot=0;//問號總數memset(save,0,sizeof(save));for(i=1;i<=9;i++)for(j=1;j<=9;j++){scanf("%d",&a[i][j]);if(a[i][j]==0)//輸入?,會變成0{tot++;k++;/*記錄問號*/save[k].x=i;save[k].y=j;}cin.get();}dfs(save[1].x,save[1].y);cout<<endl;} }?
總結
以上是生活随笔為你收集整理的Sudoku Killer(HDU-1426)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通C++语言——1038:
- 下一篇: 信息学奥赛一本通C++语言——1070: