単一ニンニクの総数(DFS)

 

ニンニクはまた、今日の君主読んで、突然、子供の頃に始めた、と子供の頃の思い出を思い出してほしいです。彼は数独と呼ばれるゲームの非常に火事があり、彼の子供の頃を思い出しました。同局は緊張と興奮の高い順に開始しました。6月にはニンニク仕上がりは全く正の解を発見していない、あなたは思いませんか?私はあなたが標準の答えを与えることができます答えを知りませんか?

標準的な数独は、プロンプトデジタル組成物を得た9 * 9のグリッドで、私たちは、ブランク番号を記入する必要があるので、各行、各列、各宮殿その3 * 3重複番号が表示されないです。

 

 

 入力形式

数字の間のスペースで区切られた9×9の数だけ、。*要求された数値を示します。

出力フォーマット

わずか9×9の出力は、必要性の記入する*番号を交換します。

この質問への唯一の答えは、答えの要件が正しい満たしていません

 

サンプル入力

* 2  6 * * * * * *
* * * 5 * 2 * 4 
* * * 1 * * * * 7 
* 3 * 2 * 1  8 *
* * * 3 * 9 * * *
* 5  4 * 1 * 7 *
 5 * * * * 1 * * *
 6 * 9 * 7 * * *
* * * * * * 7  5 *

サンプル出力

1  2  6  7  3  4  5  9  8 
3  7  8  5  9  2  6  1  4 
4  9  5  1  6  8  2  3  7 
7  3  9  4  2  5  1  8  6 
8  6  1  3  7  9  4  2  5 
2  5  4  8  1  6  3  7  9 
5  4  7  2  8  1  9 6  3 
6  1  3  9  5  7  8  4  2 
9  8  2  6  4  3  7  5  1

 

 

 

 

 

 

この質問は、8人の女王の問題に似て、各ラインのわずか8王妃は  1-8  の試みが、この質問は、各スペースのためである  1-9  の試み。実行可能な解決策のためにこの質問と検索が終わることができます。

小さなボックスが表示されたデジタルマーク、デジタルがあるか否かの列をマーク、デジタルがあるか否かの方法で行をマーク標識。

 

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <iostream>
  4 #include <string>
  5 #include <math.h>
  6 #include <algorithm>
  7 #include <vector>
  8 #include <stack>
  9 #include <queue>
 10 #include <set>
 11 #include <map>
 12 #include <sstream>
 13 const int INF=0x3f3f3f3f;
 14 typedef long long LL;
 15 const int mod=1e9+7;
 16 const double PI = acos(-1);
 17 const double eps =1e-8;
 18 #define Bug cout<<"---------------------"<<endl
 19 const int maxn=1e5+10;
 20 using namespace std;
 21 
 22 char G[11][11];
 23 int cnt[10]={9,9,9,9,9,9,9,9,9,9};//每个数字剩多少个 
 24 int flag;//是否找到答案 
 25 
 26 void PT()//输出答案 
 27 {
 28     for(int i=0;i<9;i++)
 29     {
 30         for(int j=0;j<9;j++)
 31         {
 32             if(j==0) printf("%c",G[i][j]);
 33             else printf(" %c",G[i][j]);
 34         }
 35         printf("\n");
 36     }
 37     flag=1;
 38 }
 39 
 40 int judge(int x,int y,int num)//判断是否可以在G[x][y]处填入num 
 41 {
 42     for(int i=0;i<9;i++)
 43     {
 44         if(G[x][i]=='0'+num||G[i][y]=='0'+num)
 45             return 0;
 46     }
 47     for(int i=x/3*3;i<x/3*3+3;i++)
 48     {
 49         for(int j=y/3*3;j<y/3*3+3;j++)
 50         {
 51             if(G[i][j]=='0'+num)
 52                 return 0;
 53         }
 54     }
 55     return 1;
 56 }
 57 
 58 void DFS(int x,int y) //一层一层搜索 
 59 {
 60     if(x==9&&y==0)
 61     {
 62         if(flag==0) PT();
 63         return;
 64     }
 65     if(G[x][y]=='*')
 66     {
 67         for(int i=1;i<=9;i++)
 68         {
 69             if(judge(x,y,i)&&cnt[i])
 70             {
 71                 G[x][y]='0'+i; cnt[i]--;
 72                 if(y==8) DFS(x+1,0);
 73                 else DFS(x,y+1);
 74                 if(flag) return ;
 75                 G[x][y]='*'; cnt[i]++;
 76             }
 77         }
 78     }
 79     else
 80     {
 81         if(y==8) DFS(x+1,0);
 82         else DFS(x,y+1);
 83     }
 84     return ;
 85 }
 86 
 87 
 88 int main()
 89 {
 90     #ifdef DEBUG
 91     freopen("sample.txt","r",stdin);
 92     #endif
 93     ios_base::sync_with_stdio(false);
 94     cin.tie(NULL);
 95     
 96     for(int i=0;i<9;i++)
 97     {
 98         for(int j=0;j<9;j++)
 99         {
100             scanf("%c",&G[i][j]);
101             getchar();
102             if(G[i][j]>='1'&&G[i][j]<='9')
103                 cnt[G[i][j]-'0']--;
104         }
105     }
106     DFS(0,0);
107 
108     return 0;
109 }

 

 

 

 

-

おすすめ

転載: www.cnblogs.com/jiamian/p/12174269.html