HDU-1426
数独游戏的规则是这样的:在一个9x9的方格中,你需要把数字1-9填写到空格当中,并且使方格的每一行和每一列中都包含1-9这九个数字。同时还要保证,空格中用粗线划分成9个3x3的方格也同时包含1-9这九个数字。比如有这样一个题,大家可以仔细观察一下,在这里面每行、每列,以及每个3x3的方格都包含1-9这九个数字。
#include<iostream>
using namespace std;
struct
{
int x,y;
}q[81];
int map[9][9],f,num;
int check(int k,int cur)
{
int i,j;
for(i=0;i<9;i++)
if(map[i][q[cur].y]==k||map[q[cur].x][i]==k)
return 0;
int x=q[cur].x/3*3,y=q[cur].y/3*3;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
{
if(map[i+x][j+y]==k)
return 0;
}
return 1;
}
void dfs(int cur)
{
if(cur==num)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<8;j++)
cout<<map[i][j]<<" ";
cout<<map[i][8]<<endl;
}
f=1;
return ;
}
else
{
for(int i=1;i<=9;i++)
if(check(i,cur)&&f==0)
{
map[q[cur].x][q[cur].y]=i;
dfs(cur+1);
map[q[cur].x][q[cur].y]=0;
}
}
}
int main()
{
int i,j,t=0;
char s;
while(cin>>s)
{
num=0,f=0;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
{
if(!(i==0&&j==0))
cin>>s;
if(s=='?')
{
map[i][j]=0;
q[num].x=i;
q[num].y=j;
num++;
}
else
map[i][j]=s-'0';
}
if(t++)
cout<<endl;
dfs(0);
}
}
本文介绍了一种解决数独游戏的算法实现。通过回溯搜索的方法填充空白格,确保每一行、每一列及每个3x3宫格内的数字都不重复。代码详细展示了如何检查数字的有效性以及递归地寻找解决方案。
593

被折叠的 条评论
为什么被折叠?



