您的位置:首页 > 其它

hdu 1045 Fire Net(回溯搜索)

2013-08-17 10:12 330 查看
搜索,回溯!!!人的一生避免不了会犯一些小错误!!!

那么犯错错误可以回头的!不可以一直错下去的!!!

#include<stdio.h>

#include<string.h>

int visit[10][10];

char map[10][10];

int n,ans,ss,t;

int judge(int x,int y)

{

int k;

if(x<0||x>=n||y<0||y>=n)

return 0;

if(visit[x][y]==1||map[x][y]=='X')

return 0;

for(k=x-1;k>=0;k--)

{

if(map[k][y]=='X')//判断这一行中间是否有X

break;

if(visit[k][y]==1)

{

return 0;

}

}

for(k=y-1;k>=0;k--)

{

if(map[x][k]=='X')//判断这一列中间是否有X

break;

if(visit[x][k]==1)

return 0;

}

return 1;//严格的筛选!

}

void dfs(int ss)

{

int x,y;

if(ss==n*n)

{

if(ans<t)

ans=t;

return ;

}

x=ss/n;y=ss%n;

if(judge(x,y))

{

t++;

visit[x][y]=1;

dfs(ss+1);

t--;

visit[x][y]=0;

dfs(ss+1);

}

else

dfs(ss+1);

}

int main()

{

int i;

while(scanf("%d",&n),n)

{

t=0;

for(i=0;i<n;i++)

scanf("%s",map[i]);

memset(visit,0,sizeof(visit));

ans=0;

dfs(0);

printf("%d\n",ans);

}

return 0;

}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: