数独简单版
题目链接
数独是一种传统益智游戏,你需要把一个 9×9 的数独补充完整,使得图中每行、每列、每个 3×3 的九宫格内数字 1∼9 均恰好出现一次。
请编写一个程序填写数独。
输入格式
输入共 9 行,每行包含一个长度为 9 的字符串,用来表示数独矩阵
其中的每个字符都是 1∼9 或 .(表示尚未填充)。
输出格式
输出补全后的数独矩阵。
数据保证有唯一解。
输入样例:
.2738. .1.
.1. . .6735
. . . . . . .29
3.5692.8.
. . . . . . . . .
.6.1745.3
64. . . . . . .
9518 . . . 7.
. 8 . . 6534.
输出样例:
527389416
819426735
436751829
375692184
194538267
268174593
643217958
951843672
782965341
代码实现
#include<iostream>
#include<cstring>
#include<algorithm>
#include<math.h>
using namespace std;
const int N=10;
bool row[N][N],col[N][N],cube[3][3][N];
char map[N][N];
bool dfs(int x,int y)
{
if(y==9)//一行满了,换下一行
{
x++,y=0;
}
if(x==9)//如果都填满了,则输出;
{
for(int i=0;i<9;i++)
cout<<map[i]<<endl;
return true;
}
if(map[x][y]!='.') //如果有数直接跳过
return dfs(x,y+1);
for(int i=0;i<9;i++)
{
if(!row[x][i]&&!col[y][i]&&!cube[x/3][y/3][i])//如果行列方块都没有i就记录i
{
map[x][y]=i+'1';
row[x][i]=col[y][i]=cube[x/3][y/3][i]=true;
if(dfs(x,y+1)) return true;
row[x][i]=col[y][i]=cube[x/3][y/3][i]=false;//换个数
map[x][y]='.';
}
}
return false;
}
int main()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cin>>map[i][j];
if(map[i][j]!='.')
{
int x=map[i][j]-'1';
row[i][x]=col[j][x]=cube[i/3][j/3][x]=true;
//row[i][x]代表第i行有x存在,col[j][x]代表第j列有x存在
//cube[i/3][j/3][x]代表ij所在方阵存在x
}
}
}
dfs(0,0);
return 0;
}