这个题和上一题类似,都是回溯,用的方法基本上相同了,其实我是先做得得这道题,回溯+递归,深度优先遍历,是看了别人的代码才写出来的,明天继续练吧,深搜
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int map[12][12];
int step[4][2]={1,0,-1,0,0,1,0,-1};
int m,n,ok;
int travel()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(!map[i][j])
return 0;
return 1;
}
void dfs(int x,int y)
{
map[x][y]=1;
int i,a,b;
if(travel())
{
ok=1;
return;
}
for(i=0;i<4;i++)
{
a=x+step[i][0];
b=y+step[i][1];
if(a>=1&&b>=1&&a<=n&&b<=m&&!map[a][b])
dfs(a,b);
}
if(!ok)
map[x][y]=0;
return;
}
int main()
{
int i,j,flag,flag1;
char t;
while(scanf("%d%d",&n,&m),m!=0||n!=0)
{
ok=0;
getchar();
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%c",&t);
if(t=='S')
map[i][j]=1;
}
getchar();
}
dfs(1,1);
if(ok)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
这篇博客介绍了如何利用深度优先遍历(DFS)和回溯策略解决ZOJ 2100题目。博主通过递归实现DFS,并表示是从他人代码中学习到这种方法。计划继续深化此类问题的练习。
625

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



