其实深搜和广搜都一样,没有太大的差别,因为每次都是只走了一个
深搜:
#include<stdio.h>
#include<string.h>
int book[100][100];
char map[100][100];
int s;
int n,m,count,flag;
void dfs(int c,int r)
{
if(book[c][r])
{
flag=1;
s=book[c][r]-1;
return;
}
if(c<1||c>n||r<1||r>m)
{
return;
}
count++;
book[c][r]=count;
if(map[c][r]=='N')
dfs(c-1,r);
else if(map[c][r]=='S')
dfs(c+1,r);
else if(map[c][r]=='E')
dfs(c,r+1);
else if(map[c][r]=='W')
dfs(c,r-1);
}
int main()
{
int k,i,j;
while(scanf("%d%d%d",&n,&m,&k)&&n+m+k)
{
flag=0;
memset(book,0,sizeof(book));
count=0;
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%c",&map[i][j]);
getchar();
}
dfs(1,k);
if(flag)
printf("%d step(s) before a loop of %d step(s)\n",s,count-s);
else
printf("%d step(s) to exit\n",count);
}
return 0;
}
广搜;
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct node{
int r,c;
node(int c1,int r1):c(c1),r(r1){
}
};
int book[100][100];
char map[100][100];
int s;
int n,m,k,count,flag;
void bfs()
{
queue<node>q;
q.push(node(1,k));
while(!q.empty())
{
node now=q.front();
q.pop();
if(book[now.c][now.r])
{
flag=1;
s=book[now.c][now.r]-1;
return;
}
if(now.c<1||now.c>n||now.r<1||now.r>m)
{
return;
}
count++;
book[now.c][now.r]=count;
if(map[now.c][now.r]=='N')
q.push(node(now.c-1,now.r));
else if(map[now.c][now.r]=='S')
q.push(node(now.c+1,now.r));
else if(map[now.c][now.r]=='E')
q.push(node(now.c,now.r+1));
else if(map[now.c][now.r]=='W')
q.push(node(now.c,now.r-1));
}
}
int main()
{
int i,j;
while(scanf("%d%d%d",&n,&m,&k)&&n+m+k)
{
flag=0;
memset(book,0,sizeof(book));
count=0;
getchar();
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
scanf("%c",&map[i][j]);
getchar();
}
bfs();
if(flag)
printf("%d step(s) before a loop of %d step(s)\n",s,count-s);
else
printf("%d step(s) to exit\n",count);
}
return 0;
}