标签:
3 3 X#Y *** #*# 3 3 X#Y *#* #*#
4 -1
//AC 代码
#include<stdio.h>
#include<string.h>
char map_[20][20];
struct node
{
int x,y;
int tim;
} que[100010]; ///建立存储临时遍历信息的存储栈
int chx[]= {0,1,0,-1};///移动方向
int chy[]= {1,0,-1,0};///移动方向 可以竖着看,两个两个,一共四对,分别为上下左右。
bool bj[20][20]; ///标记变量,是否已经走过此地方。
int bfs(int x1,int y1,int x2,int y2,int n,int m) ///bfs搜索
{
node tmp,now; /// 建立临时存储坐标结构体
now.x=x1; ///将 X 的横坐标给初始化。
now.y=y1; ///将 X 的竖坐标给初始化。
now.tim=0; ///行走步数
int s=0,e=0; ///
memset(bj,0,sizeof(bj)); ///将标记数组清0
que[s++]=now; ///栈底的初始化为X的坐标等
bj[now.x][now.y] =1; ///标记字符数组开始已经走过
while(s>e) ///进入循环,最终s,e相等时会跳出循环,如果找到Y会在循环中就跳出的
{
now = que[e++]; /// X的坐标同样给now,只不过e++,
if(now.x == x2 && now.y==y2)
{
return now.tim; /// 等于Y时跳出,因为找到Y了,返回步数就可以。
}
for(int i=0; i<4; i++) ///i<4是因为只能有上下左右四个方向。
{
tmp=now;
tmp.x+=chx[i];
tmp.y+=chy[i];
tmp.tim++;
if(tmp.x >=0 && tmp.x <n && tmp.y >= 0 && tmp.y<m)
{
if(map_[tmp.x][tmp.y] != ‘#‘ && !bj[tmp.x][tmp.y]) ///不等于“#”或出界时继续走
{
que[s++]=tmp; ///能走的话就将坐标入栈
bj[tmp.x][tmp.y] = 1; ///并标记这个地方走过
}
}
}
}
return -1; ///搜索完毕,没有找到Y,跳出
}
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
for(int i=0; i<n; i++)
{
scanf("%s",map_[i]);
}
int a[4]= {-1,-1,-1,-1};
for(int i=0; i<n; i++) //到X和Y的坐标给变量
{
for(int j=0; j<m; j++)
{
if(map_[i][j]==‘X‘)
{
a[0]=i;
a[1]=j;
}
if(map_[i][j]==‘Y‘)
{
a[2]=i;
a[3]=j;
}
}
}
if(a[0]==-1 || a[2]==-1)
{
printf("-1\n"); ///debug后台数据,可以没有。
continue;
}
int k= bfs(a[0],a[1],a[2],a[3],n,m); ///输出。
printf("%d\n",k);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/sunxueke/p/4251157.html