计蒜客 2018蓝桥模拟赛(一) 数独
蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?
标准数独是由一个给与了提示数字的 9 \times 99×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3 \times 33×3 宫都没有重复的数字出现。
输出这个数独得正解,输出格式如下:
* 2 6 * * * * * *
* * * 5 * 2 * * 4
* * * 1 * * * * 7
* 3 * * 2 * 1 8 *
* 5 4 * 1 * * 7 *
5 * * * * 1 * * *
6 * * 9 * 7 * * *
* * * * * * 7 5 *
把上面的 * 替换成 1−91 - 91−9 就可以了
提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号。
题目链接:https://nanti.jisuanke.com/t/A1599
这题直接dfs就可以
#include<bits/stdc++.h>
using namespace std;
int form[9][9]={
{0,2,6,0,0,0,0,0,0},
{0,0,0,5,0,2,0,0,4},
{0,0,0,1,0,0,0,0,7},
{0,3,0,0,2,0,1,8,0},
{0,0,0,3,0,9,0,0,0},
{0,5,4,0,1,0,0,7,0},
{5,0,0,0,0,1,0,0,0},
{6,0,0,9,0,7,0,0,0},
{0,0,0,0,0,0,7,5,0}};
int check(int x,int y,int i) //查找是否重复
{
for(int j=0;j<9;j++) //查找行列
{
if(form[x][j]==i&&j!=y)
return 0;
if(form[j][y]==i&&x!=j)
return 0;
}
int xx=x/3;
int yy=y/3;
for(int j=xx*3;j<xx*3+3;j++) //查找3*3方格
{
for(int k=yy*3;k<yy*3+3;k++)
{
if(form[j][k]==i&&x!=j&&y!=k)
return 0;
}
}
return 1;
}
bool dfs(int cnt)
{
if(cnt>=81) //搜索完毕输出答案
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
printf("%d",form[i][j]);
printf("\n");
}
return 1;
}
int x=cnt/9,y=cnt%9; //找到行列
if(form[x][y]==0) //如果当前位置没有填数
{
for(int i=1;i<10;i++)
{
form[x][y]=i; //填数
if(check(x,y,i))//查找是否重复
if(dfs(cnt+1)) //查看下一个是否出现重复数字
return 1;
form[x][y]=0; //回溯
}
}
else
return dfs(cnt+1); //如果已经填数,搜索下一个位置
return 0;
}
int main()
{
dfs(0);
return 0;
}