BFS--广度优先搜索 先把同层的找完,再往下一层去找。用队列实现。
#include<stdio.h>
#include<string.h>
using namespace std;
struct node
{
int x,y;
int t;
}que[200];
char mp[20][20];
bool vis[20][20];
int chx[]={0,0,1,-1}; //四个方向
int chy[]={1,-1,0,0};
int bfs(int x,int y,int n,int m)
{
int i,j;
int s=0,e=0;
struct node now,tmp;
now.x=x; //初始化
now.y=y;
now.t=0;
que[s++]=now; //第一个点进队列
vis[x][y]=1;
while(s>e)
{
now=que[e++]; //出队列
if(mp[now.x][now.y]=='Y')
return now.t;
for(i=0;i<4;i++)
{
tmp.x=now.x+chx[i];
tmp.y=now.y+chy[i];
tmp.t=now.t+1;
if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&!vis[tmp.x][tmp.y]&&mp[tmp.x][tmp.y]!='#')
{
que[s++]=tmp; //符合条件,进队列
vis[tmp.x][tmp.y]=1; //标记为1,不再经过此点
}
}
}
return -1; //不能找到Y点,返回值为-1
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis)); //标记数组初始化
for(i=0;i<n;i++)
scanf("%*c%s",mp[i]);
for(i=0;i<n;i++) //找到X的坐标
{
for(j=0;j<m;j++)
{
if(mp[i][j]=='X')
break;
}
if(j<m)
break;
}
int ans = bfs(i,j,n,m);
printf("%d\n",ans);
}
return 0;
}
DFS--深度优先搜索 :对于最新发现的顶点,如果它还有以此为起点还未发现的边,就继续搜索下去。直到当前点的所有方向都已搜索完毕不符合条件了,就往前回溯。
#include<stdio.h>
#include<string.h>
using namespace std;
const int inf = 1<<20;
char mp[20][20];
bool vis[20][20];
int mini;
int chx[]={0,0,1,-1};
int chy[]={1,-1,0,0};
struct node
{
int x,y;
};
void dfs(int x,int y,int n,int m,int ans)
{
int i,j;
struct node tmp;
if(ans>=mini)
return ;
if(ans<mini&&mp[x][y]=='Y')
{
mini=ans;
return ;
}
for(i=0;i<4;i++)
{
tmp.x=x+chx[i];
tmp.y=y+chy[i];
if(tmp.x>=0&&tmp.x<n&&tmp.y>=0&&tmp.y<m&&!vis[tmp.x][tmp.y]&&mp[tmp.x][tmp.y]!='#')
{
vis[tmp.x][tmp.y]=1;
dfs(tmp.x,tmp.y,n,m,ans+1);
vis[tmp.x][tmp.y]=0;
}
}
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
mini=inf;
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
scanf("%*c%s",mp[i]);
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
if(mp[i][j]=='X')
break;
}
if(j<m)
break;
}
int ans=0;
vis[i][j]=1;
dfs(i,j,n,m,ans);
if(mini==inf)
printf("-1\n");
else
printf("%d\n",mini);
}
return 0;
}