1. 程式人生 > >洛谷—— P1784 數獨

洛谷—— P1784 數獨

好的 code 根據 int pro return ons num 全球

https://www.luogu.org/problem/show?pid=1784

題目描述

數獨是根據9×9盤面上的已知數字,推理出所有剩余空格的數字,並滿足每一行、每一列、每一個粗線宮內的數字均含1-9,不重復。每一道合格的數獨謎題都有且僅有唯一答案,推理方法也以此為基礎,任何無解或多解的題目都是不合格的。

芬蘭一位數學家號稱設計出全球最難的“數獨遊戲”,並刊登在報紙上,讓大家去挑戰。

這位數學家說,他相信只有“智慧最頂尖”的人才有可能破解這個“數獨之謎”。

據介紹,目前數獨遊戲的難度的等級有一道五級,一是入門等級,五則比較難。不過這位數學家說,他所設計的數獨遊戲難度等級是十一,可以說是所以數獨遊戲中,難度最高的等級他還表示,他目前還沒遇到解不出來的數獨遊戲,因此他認為“最具挑戰性”的數獨遊戲並沒有出現。

輸入輸出格式

輸入格式:

一個未填的數獨

輸出格式:

填好的數獨

輸入輸出樣例

輸入樣例#1:
8 0 0 0 0 0 0 0 0 
0 0 3 6 0 0 0 0 0 
0 7 0 0 9 0 2 0 0 
0 5 0 0 0 7 0 0 0 
0 0 0 0 4 5 7 0 0 
0 0 0 1 0 0 0 3 0 
0 0 1 0 0 0 0 6 8 
0 0 8 5 0 0 0 1 0 
0 9 0 0 0 0 4 0 0
輸出樣例#1:
8 1 2 7 5 3 6 4 9 
9 4 3 6 8 2 1 7 5 
6 7 5 4 9 1 2 8 3 
1 5 4 2 3 7 8 9 6 
3 6 9 8 4 5 7 2 1 
2 8 7 1 6 9 5 3 4 
5 2 1 9 7 4 3 6 8 
4 3 8 5 2 6 9 1 7 
7 9 6 3 1 8 4 5 2

說明

你猜,你猜,你猜猜猜

猜不出來吧,我不告訴你~~~

從最靠右下(改變順序有時變快)沒填數的點開始搜,

 1 #include <algorithm>
 2 #include <cstdio>
 3 
 4 const int pos[9][9]={{0,0,0,1,1,1,2,2,2},
 5                     {0,0,0,1,1,1,2,2,2},
 6                       {0,0,0,1,1,1,2,2,2},
 7                       {3,3,3,4,4,4,5
,5,5}, 8 {3,3,3,4,4,4,5,5,5}, 9 {3,3,3,4,4,4,5,5,5}, 10 {6,6,6,7,7,7,8,8,8}, 11 {6,6,6,7,7,7,8,8,8}, 12 {6,6,6,7,7,7,8,8,8}}; 13 bool h[9][10],l[9][10],g[9][10]; 14 int vx[82],vy[82],cnt,deep,map[9][9]; 15 16 void DFS(int num) 17 { 18 if(!num) 19 { 20 for(int i=0; i<9; ++i) 21 { 22 for(int j=0; j<9; ++j) 23 printf("%d ",map[i][j]); 24 puts(""); 25 } 26 std::exit(0); 27 } 28 if(++deep>1e7) return ; 29 int tox=vx[num],toy=vy[num],topos=pos[tox][toy],tmp; 30 for(int i=1; i<=9; ++i) 31 { 32 if(!h[tox][i]&&!l[toy][i]&&!g[topos][i]) 33 { 34 h[tox][i]=1; 35 l[toy][i]=1; 36 g[topos][i]=1; 37 map[tox][toy]=i; 38 DFS(num-1); 39 h[tox][i]=0; 40 l[toy][i]=0; 41 g[topos][i]=0; 42 map[tox][toy]=0; 43 } 44 } 45 } 46 47 int AC() 48 { 49 for(int i=0; i<9; ++i) 50 for(int j=0; j<9; ++j) 51 { 52 scanf("%d",&map[i][j]); 53 if(!map[i][j]) 54 { 55 vx[++cnt]=i; 56 vy[cnt]=j; 57 } 58 else 59 { 60 h[i][map[i][j]]=1; 61 l[j][map[i][j]]=1; 62 g[pos[i][j]][map[i][j]]=1; 63 } 64 } 65 DFS(cnt); 66 return 0; 67 } 68 69 int Aptal=AC(); 70 int main(){;}

洛谷—— P1784 數獨