描述
数独游戏规则
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
在9阶方阵中,包含了81个小格(九列九行),其中又再分成九个小正方形(称为宫),每宫有九小格。
游戏刚开始时,盘面上有些小格已经填了数字(称为初盘),游戏者要在空白的小格中填入1到9的数字,
使得最后每行、每列、每宫都不出现重复的数字,而且每一个游戏都只有一个唯一的解答(称为终盘)。
输入
一个9*9的矩阵,0表示该位置是空白。
输出
一个9*9的矩阵,格式与输入类似。
输入样例
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
输出样例
971453268
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
428976135
365182947
743861529
892345671
516729483
154238796
687594312
239617854
#include <iostream>
#include <stdio.h>
using namespace std;
int grid[9][9],total;
bool flag=false;
struct point
{
int x,y;
}needsolve[80];
bool check(int x,int y,int t)//尝试把t放进grid[x][y]里
{
int i,j,bigx,bigy;
for (i=0;i<=8;i++)
{
if (grid[x][i]==t||grid[i][y]==t)
{
return false;
}
}
bigx=x/3;
bigy=y/3;
for (i=bigx*3;i<=bigx*3+2;i++)
{
for (j=bigy*3;j<=bigy*3+2;j++)
{
if (grid[i][j]==t)
{
return false;
}
}
}
return true;
}
void write()
{
int i,j;
for (i=0;i<=8;i++)
{
for (j=0;j<=8;j++)
{
printf("%d",grid[i][j]);
}
printf("\n");
}
return;
}
void dfs(int now)//对needsolve[now]进行讨论
{
int i;
if (now>=total)
{
write();
flag=true;
return;
}
else if (flag==false)
{
for (i=1;i<=9;i++)
{
if (check(needsolve[now].x,needsolve[now].y,i)==true)
{
grid[needsolve[now].x][needsolve[now].y]=i;
dfs(now+1);
grid[needsolve[now].x][needsolve[now].y]=0;
}
}
}
return;
}
int main()
{
int i,j,k=0;
for (i=0;i<=8;i++)
{
for (j=0;j<=8;j++)
{
scanf("%1d",&grid[i][j]);
if (grid[i][j]==0)
{
needsolve[k].x=i;
needsolve[k].y=j;
k++;
}
}
}
total=k;
dfs(0);
return 0;
}