Problem Description
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
为了简化问题,我们把地图抽象为n*m的矩阵,行编号从上到下为1 到 n,列编号从左到右为1 到 m。矩阵中’X’表示X所在的初始坐标,’Y’表示Y的位置 , ’#’表示当前位置不能走,’ * ’表示当前位置可以通行。X每次只能向上下左右的相邻的 ’*’ 移动,每移动一次耗时1秒。
Input
多组输入。每组测试数据首先输入两个整数n,m(1<= n ,m<=15 )表示地图大小。接下来的n 行,每行m个字符。保证输入数据合法。
Output
若X可以到达Y的家,输出最少时间,否则输出 -1。
Sample Input
3 3 X#Y *** #*# 3 3 X#Y *#* #*#
Sample Output
4 -1
Hint
Source
zmx
AC代码(简单bfs)
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
struct node
{
int x, y;
int step;
} f, s;
char mp[30][30];
int vis[30][30], n, m;
int nxt[5][3] = {{0,1},{0,-1},{1,0},{-1,0}};
void bfs(int i, int j)
{
queue<node>q;
s.x = i, s.y = j, s.step = 0;
vis[i][j] = 1;
q.push(s);
while(!q.empty())
{
s = q.front();
q.pop();
if(mp[s.x][s.y]=='Y')
{
printf("%d\n",s.step);
return;
}
for(i = 0; i<4; i++)
{
f.x = s.x+nxt[i][0];
f.y = s.y+nxt[i][1];
if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&mp[f.x][f.y]!='#'&&!vis[f.x][f.y])
{
f.step = s.step+1;
q.push(f);
vis[f.x][f.y] = 1;
}
}
}
printf("-1\n");
return;
}
int main()
{
int i, j;
while(scanf("%d %d",&n,&m)!=EOF)
{
getchar();
memset(vis, 0, sizeof(vis));
for(i = 0; i<n; i++)
{
cin>>mp[i];
}
for(i = 0; i<n; i++)
{
for(j = 0; j<m; j++)
{
if(mp[i][j]=='X')
{
break;
}
}
if(j<m)
break;
}
bfs(i, j);
}
return 0;
}
/***************************************************
Result: Accepted
Take time: 0ms
Take Memory: 200KB
****************************************************/