题目描述
蒜头君今天突然开始还念童年了,想回忆回忆童年。他记得自己小时候,有一个很火的游戏叫做数独。便开始来了一局紧张而又刺激的高阶数独。蒜头君做完发现没有正解,不知道对不对? 不知道聪明的你能否给出一个标准答案?标准数独是由一个给与了提示数字的 9×9 网格组成,我们只需将其空格填上数字,使得每一行,每一列以及每一个 3×3 宫都没有重复的数字出现。
把上面的 * 替换成 1−9 就可以了
提醒:两个数字之间要有一个空格,其他地方不要输出多余的符号。
本题答案不唯一,符合要求的答案均正确
样例1:
输入:
输出:
分析:用dfs思想去一个空一个空的尝试,将行,列,小格子里面的数用数组装起来方便检测是否有重复的数字,而且这里在输出的控制上也是有一定技巧的(避免了下一次回溯对当前输出造成的影响)
#include<cstdio>
char mp[10][10];
bool tx[10][10],ty[10][10],tg[10][10];//分别记录每行,每列,每个方格中出现的数字
bool f;
void dfs(int x,int y){
if(f){
return;
}
if(x==9){
f=true;
for(int i=0;i<9;i++){//输出地图,避免回溯造成影响
for(int j=0;j<9;j++){
printf(" %c",mp[i][j]);
if(j==8)printf("\n");//处理行末空格
else
printf(" ");
}
}
return;
}
if(y==9){//一行填满切到下一行
dfs(x+1,0);
return;
}
if(mp[x][y]!='*'){//不能填的位置直接跳过
dfs(x,y+1);
return;
}
for(int i=1;i<=9;i++){//尝试9个数
if(!tx[x][i]&&!ty[y][i]&&!tg[x/3*3+y/3][i]){
tx[x][i]=true;
ty[y][i]=true;
tg[x/3*3+y/3][i]=true;
mp[x][y]=i+'0';
dfs(x,y+1);//填下一个数
tx[x][i]=false;
ty[y][i]=false;
tg[x/3*3+y/3][i]=false;
mp[x][y]='*';
}
}
}
int main(){
for(int i=0;i<9;i++){//输入地图
for(int j=0;j<9;j++){
scanf(" %c",&mp[i][j]);//这个地方用printf必须在前面加空格,吃掉前面输入的空格,如果是cin就不需要
}
}
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(mp[i][j]!='*'){
tx[i][mp[i][j]-'0']=true;//这一行出现了这个数
ty[j][mp[i][j]-'0']=true;//这一列出现了这个数
tg[i/3*3+j/3][mp[i][j]-'0']=true;//这个方格出现了这个数
}
}
}
dfs(0,0);//从mp[0][0]这个位置开始填数;
return 0;
}
运行结果: