日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Sudoku Killer(HDU-1426)

發布時間:2025/3/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。