您的位置:首页 > 其它

【BFS广度优先搜索】SDUTOJ 2779---找朋友

2014-07-29 09:16 134 查看
找朋友
Time Limit:1000MS Memory
Limit:65536KB 64bit IO Format:%lld & %llu

Description

X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。

Input

多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行n个字符。保证输入数据合法。

Output

若X可以到达Y的家,输出最少时间,否则输出 -1。

Sample Input

3 3
X#Y
***
#*#
3 3
X#Y
*#*
#*#


Sample Output

4
-1




#include<stdio.h>
#include<string.h>
struct node
{
int x,y,c;
}q[300];
int tx[]={0,1,0,-1};
int ty[]={1,0,-1,0};
int v[16][16];
char map[16][16];
void bfs(int x,int y,int m,int n)
{
int i,e=1,s=0;
struct node t,f;
t.x=x;
t.y=y;
t.c=0;//初始化总时间为0
q[0]=t;
while(s<e)
{
t=q[s++];
if(map[t.x][t.y]=='Y')
{
printf("%d\n",t.c);
return ;
}//找到后输出总时间
for(i=0;i<4;i++)//上下左右四个方向寻找
{
f.x=t.x+tx[i];//以X点为原点左右移动后的横坐标
f.y=t.y+ty[i];//以Y点为原点上下移动后的纵坐标
if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&v[f.x][f.y]==0&&map[f.x][f.y]!='#')//避免走出地图或者碰到障碍物
{
f.c=t.c+1;//记录走一步后的总时间
q[e++]=f;//记录移动后的状态
v[f.x][f.y]=1;//标记该点防止回溯
}
}
}
printf("-1\n");//没有找到就输出-1
}
int main()
{
int i,j,m,n;
while(~scanf("%d%d",&n,&m))
{
getchar();
for(i=0;i<n;i++)
scanf("%s",map[i]);
memset(v,0,sizeof(v));
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
if(map[i][j]=='X')
break;
if(j!=m)break;
}//找到X的所在位置
v[i][j]=1;//标记该为1
bfs(i,j,m,n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: