洛谷 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;
}