zoukankan      html  css  js  c++  java
  • 洛谷P1784 数独

    To 洛谷.1784 数独(类似(或者说相同)题:CODEVS.4966 简单数独(4*4数独) CODEVS.2924 数独挑战

    题目描述

    数独是根据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

    说明

    你猜,你猜,你猜猜猜

    猜不出来吧,我不告诉你~~~

    代码:

      DFS

    #include<cstdio>
    using namespace std;
    const int N=10;
    const int group[9][9]=
    {
        0,0,0,1,1,1,2,2,2,
        0,0,0,1,1,1,2,2,2,
        0,0,0,1,1,1,2,2,2,
        3,3,3,4,4,4,5,5,5,
        3,3,3,4,4,4,5,5,5,
        3,3,3,4,4,4,5,5,5,
        6,6,6,7,7,7,8,8,8,
        6,6,6,7,7,7,8,8,8,
        6,6,6,7,7,7,8,8,8
    };//代表9个3*3的区域 
    bool row[N][N],col[N][N],gr[N][N];
    //row[i][j]:判断第i行是否出现过数字j
    //col[i][j]:判断第i列是否出现过数字j
    //gr[i][j]:判断区域i是否出现过数字j 
    int sudoku[N][N];//数独 
    bool check(int x,int y,int w)
    {
        if(row[x][w]||col[y][w]||gr[group[x][y]][w])//若该行 或 该列 或 该3*3区域出现过w 
          return 0;//不能填充w 
        return 1;//可填充 
    }
    void dfs(int x,int y)
    {
        if(x==9)//如果此时棋盘满足约束,则输出 
        {
            for(int i=0;i<9;i++)
            {
                for(int j=0;j<9;j++)
                  printf("%d ",sudoku[i][j]);
                printf("
    ");
            }
            return;
        }
        int nxtx=x,nxty=y+1;//计算下一个状态 
        if(nxty==9)
          ++nxtx,nxty=0;
        if(sudoku[x][y]!=0)//原来就有数字,直接跳过 
          dfs(nxtx,nxty);
        else//原来没有数字,枚举所有可能:填充1-9 
        {
            for(int j=1;j<=9;j++)
                if(check(x,y,j))
                {
                    row[x][j]=col[y][j]=gr[group[x][y]][j]=1;
                  sudoku[x][y]=j;
                    dfs(nxtx,nxty);//搜索下一状态 
                    sudoku[x][y]=0;//回溯,复原棋盘 
                    row[x][j]=col[y][j]=gr[group[x][y]][j]=0;
              }
        }
    }
    int main()
    {
        for(int i=0;i<9;i++)
          for(int j=0;j<9;j++)
          {
                int a;
                scanf("%d",&a);
                if(a==0) continue;
                row[i][a]=1;//第i行已有a 
                col[j][a]=1;//第j列已有a 
                gr[group[i][j]][a]=1;//i行j列所在区域 已有a 
                sudoku[i][j]=a;//填充入sudoku 
          }
        dfs(0,0);
        return 0;
    }
  • 相关阅读:
    mysql----show slave status G 说明
    mysqldump 的方式来搭建master-->slave 的复制架构
    C++----练习--string 从文件中一个一个单词的读直到文件尾
    python 全排列combinations和permutations函数
    什么是restful api
    git知识点
    Hash算法解决冲突的方法
    python之单例设计模式
    Linux常用命令大全
    SQLAlchemy中时间格式化及将时间戳转成对应时间的方法-mysql
  • 原文地址:https://www.cnblogs.com/SovietPower/p/6889138.html
Copyright © 2011-2022 走看看