hdu: 1426 ( Sudoku Killer )
http://acm.hdu.edu.cn/showproblem.php?pid=1426
Problem : 1426 ( Sudoku Killer ) Judge Status : Accepted
RunId : 3712414 Language : C++ Author : zjut11018
Code Render Status : Rendered By HDOJ C++ Code Render Version 0.01 Beta
借助此题学习DFS
思路:把需要填数的位置保存到q中,再递归求解
#include<iostream>
using namespace std;
int map[9][9];
int num,ok;
struct node
{
int x,y;
}q[81];
bool check(int k,int cur)//判断所填的数是否合法 k为准备要填的数,cur为要填的位置在q中的编号
{
for(int i=0;i<9;i++)
{
if(map[q[cur].x][i]==k||map[i][q[cur].y]==k)return 0;//判断行和列是否用过k
}
int x=q[cur].x/3*3;
int y=q[cur].y/3*3;
for(int i=0;i<3;i++)//判断9个格子的小块是否用过k
for(int j=0;j<3;j++)
{
if(map[x+i][y+j]==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++)
{
printf("%d ",map[i][j]);
}
printf("%d\n",map[i][8]);
}
ok=1;
return;
}
else
{
for(int i=1;i<=9;i++)
{
if(check(i,cur)&&!ok)//填的数合法且最终答案还未形成
{
map[q[cur].x][q[cur].y]=i;//填表
DFS(cur+1);//递归
map[q[cur].x][q[cur].y]=0;//回溯
}
}
}
return;
}
int main()
{
char s;
int cas=0;
while(cin>>s)
{
num=0;
if(s=='?')map[0][0]=0;
else map[0][0]=s-'0';
for(int i=0;i<9;i++)
for(int 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;//把问号格子的坐标存在q里
num++;
}
else map[i][j]=s-'0';
}
ok=0;
if(cas++)printf("\n");
DFS(0);
}
}
浙公网安备 33010602011771号