您的位置:首页 > 其它

计蒜客 2018蓝桥杯模拟赛(一)数独

2018-03-05 23:50 337 查看
 1000ms
 131072K

蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?
标准数独是由一个给与了提示数字的 9 \times 99×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3 \times 33×3 宫都没有重复的数字出现。



输出这个数独得正解,输出格式如下:
1
* 2 6 * * * * * *
2
* * * 5 * 2 * * 4
3
* * * 1 * * * * 7
4
* 3 * * 2 * 1 8 *
5
* * * 3 * 9 * * *
6
* 5 4 * 1 * * 7 *
7
5 * * * * 1 * * *
8
6 * * 9 * 7 * * *
9
* * * * * * 7 5 *
把上面的 
*
 替换成 1 - 91−9 就可以了
提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号。#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int fla;
int map[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}};
bool visx[9][10],visy[9][10],visk[9][10];
int say(int i,int j)
{
return i/3*3+j/3;
}
int check(int num,int x,int y)
{
if(!visx[x][num]&&!visy[y][num]&&!visk[say(x,y)][num])return 1;
else return 0;
}
void boo(int x,int y)
{
if(fla==1)return ;
if(x==9&&y==0)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
if(j==0)printf("%d",map[i][j]);
else printf(" %d",map[i][j]);
}
printf("\n");
}
fla=1;
}
if(y==9)boo(x+1,0);
if(map[x][y]!=0)boo(x,y+1);
if(map[x][y]==0)
{
for(int i=1;i<=9;i++)
{
if(check(i,x,y))
{
map[x][y]=i;
visx[x][i]=1;
visy[y][i]=1;
visk[say(x,y)][i]=1;
boo(x,y+1);
map[x][y]=0;
visx[x][i]=0;
visy[y][i]=0;
visk[say(x,y)][i]=0;
}
}
}
}
int main()
{
int n,i,j;

memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
memset(visk,0,sizeof(visk));
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(map[i][j]!=0)
{
visx[i][map[i][j]]=1;
visy[j][map[i][j]]=1;
visk[say(i,j)][map[i][j]]=1;
}
}
}
boo(0,0);
fla=0;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: