码迷,mamicode.com
首页 > 其他好文 > 详细

SDUT OJ0 2779 找朋友

时间:2015-01-26 20:40:02      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。

输入

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

输出

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

示例输入

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;
}

 

 

SDUT OJ0 2779 找朋友

标签:

原文地址:http://www.cnblogs.com/sunxueke/p/4251157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!