您的位置:首页 > 其它

nyoj 722 递归深搜

2016-05-24 16:46 225 查看
深搜用到递归,必有回溯,本体很好的利用了深搜回溯的性质,对数进行排列时可以回过头来纠错
#include<stdio.h>
#include<string.h>
int flag;
int map[9][9];
int can(int number,int x,int y)
{
int i,j;
for(i=0;i<9;i++)
{
if(number==map[i][y])
return 0;
}
for(j=0;j<9;j++)
{
if(number==map[x][j])
return 0;
}
int a=x/3*3,b=y/3*3;
for(i=a;i<a+3;i++)
{
for(j=b;j<b+3;j++)
{
if(map[i][j]==number)
return 0;
}
}
return 1;
}
void dfs(int x,int y)
{
if(flag==1)//退出递归出口,必须在调用之前判断,否则后果达不到你想要的效果
return ;
if(x==9&&y==0)//这一步如果是最后一步
{
int i,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
printf("%d ",map[i][j]);
}
printf("\n");
}
flag=1;
return ;//避免陷入下一递归调用
}
if(y==9)//这一步如果是走向下一行的第一步
dfs(x+1,0);
if(map[x][y]!=0)//这一步如果是有数字的一步
dfs(x,y+1);
if(map[x][y]==0)//这一步如果是没有数字的一步
{
int i;
for(i=1;i<=9;i++)
{
if(can(i,x,y))
{
map[x][y]=i;
dfs(x,y+1);
map[x][y]=0;
}
}
}
}
int main()
{
int i,j,n;
scanf("%d",&n);
while(n--)
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
scanf("%d",&map[i][j]);
}
}
dfs(0,0);
memset(map,0,sizeof(map));
flag=0;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: