zoukankan      html  css  js  c++  java
  • 计蒜客 数独(DFS)

    蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?

    标准数独是由一个给与了提示数字的 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

     

    这道题目类似八皇后问题,只不过八皇后是对每一行进行 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("
    ");
     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 }

    -

  • 相关阅读:
    PAT 1032 (未完成)
    PAT 1031
    PAT 1030
    将爬取到的数据存入数据框并导出
    XPath常见用法
    python 图表
    Protobuf在Unity中的通讯使用
    ProtoBuf在Unity中的使用
    Unity更新资源代码
    匿名函数
  • 原文地址:https://www.cnblogs.com/jiamian/p/12174269.html
Copyright © 2011-2022 走看看