洛谷 P1784 数独

洛谷 P1784 数独

洛谷传送门

题目描述

数独是根据 9 \times 99×9 盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个粗线宫内的数字均含 1 - 91−9 ,不重复。每一道合格的数独谜题都有且仅有唯一答案,推理方法也以此为基础,任何无解或多解的题目都是不合格的。

芬兰一位数学家号称设计出全球最难的“数独游戏”,并刊登在报纸上,让大家去挑战。

这位数学家说,他相信只有“智慧最顶尖”的人才有可能破解这个“数独之谜”。

据介绍,目前数独游戏的难度的等级有一到五级,一是入门等级,五则比较难。不过这位数学家说,他所设计的数独游戏难度等级是十一,可以说是所以数独游戏中,难度最高的等级。他还表示,他目前还没遇到解不出来的数独游戏,因此他认为“最具挑战性”的数独游戏并没有出现。

输入格式

一个未填的数独。

输出格式

填好的数独。


题解:

暴搜填数独。

POJ2676一样,就是输出格式变了一下。具体看代码:

#include<cstdio>
#include<cstring>
using namespace std;
int t,cnt;
int mp[11][11];
char mapi[11][11];
bool flag;
bool row[11][11],col[11][11],grid[11][11];
void dfs(int x,int y)
{
    if(flag)
        return;
    if(mp[x][y])
    {
        if(x==9&&y==9)
        {
            for(int i=1;i<=9;i++)
            {
                for(int j=1;j<=9;j++)
                    printf("%d ",mp[i][j]);
                puts("");
            }
            flag=1;
            return;
        }
        if(y==9)
            dfs(x+1,1);
        else
            dfs(x,y+1);
    }
    if(!mp[x][y])
    {
        int k=3*((x-1)/3)+(y-1)/3+1;
        for(int i=1;i<=9;i++)
        {
            if(!row[x][i]&&!col[y][i]&&!grid[k][i])
            {
                row[x][i]=1;
                col[y][i]=1;
                grid[k][i]=1;
                mp[x][y]=i;
                if(x==9&&y==9)
                {
                    for(int i=1;i<=9;i++)
                    {
                        for(int j=1;j<=9;j++)
                            printf("%d ",mp[i][j]);
                        puts("");
                    }
                    flag=1;
                    puts("");
                    return;
                }
                if(y==9)
                    dfs(x+1,1);
                else
                    dfs(x,y+1);
                row[x][i]=0;
                col[y][i]=0;
                grid[k][i]=0;
                mp[x][y]=0;
            }
        }
    }
}
int main()
{
    for(int i=1;i<=9;i++)
        for(int j=1;j<=9;j++)
        {
            scanf("%d",&mp[i][j]);
            if(mp[i][j])
            {
                int k=3*((i-1)/3)+(j-1)/3+1;
                row[i][mp[i][j]]=1;
                col[j][mp[i][j]]=1;
                grid[k][mp[i][j]]=1;
            }
        }
    dfs(1,1);
    return 0;
}
posted @ 2020-10-19 15:34  Seaway-Fu  阅读(175)  评论(1编辑  收藏  举报