找朋友
Time Limit: 1000 ms Memory Limit: 65536 KiB
Problem Description
X,作为户外运动的忠实爱好者,总是不想呆在家里。现在,他想把死宅Y从家里拉出来。问从X的家到Y的家的最短时间是多少。
为了简化问题,我们把地图抽象为nm的矩阵,行编号从上到下为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(因为这个符号显示不出来就用n代替了)
3 3
X#Y
nnn
#n#
3 3
X#Y
n#n
#n#
Sample Output
4
-1
值得注意两点:一个是vis数组的初始化,还有我们需要注意当我们向函数中传进X这个字符位置的结构体时,记得在传入之前就给xx.step赋值。
#include<bits/stdc++.h>
using namespace std;
struct str
{ //step代表当前位置所用步数,这样就像是一层
int x,y,step; //一层一样,感觉很巧妙,之前想这里想了好久
}p,fir; //p用来表示下一个坐标,fir用来表示当前位置的坐标
char s[30][30];
int m,a,b,n,nextx[4] = {0,0,-1,1},vis[30][30];
int nexty[4] = {-1,1,0,0}; //两个数组来表示下一步的坐标
void BFS(struct str xx)
{
queue<str> q;
q.push(xx);
vis[xx.x][xx.y] = 1;
while(q.size())
{
fir = q.front();
if(s[fir.x][fir.y] == 'Y')
{
printf("%d\n",fir.step);
return ;
}
q.pop();
for(int i = 0; i < 4; i++)
{
p.x = fir.x + nextx[i];
p.y = fir.y + nexty[i];
if(p.x >= 0 && p.x < n && p.y >= 0 && p.y < m && vis[p.x][p.y] == 0 && s[p.x][p.y] != '#')
{
vis[p.x][p.y] = 1;
p.step = fir.step+1;
q.push(p);
}
}
}
printf("-1\n");
return ;
}
int main()
{
int i,j;
struct str xx; //xx表示X出现的位置
while(~scanf("%d %d",&n,&m))
{
getchar();
memset(vis,0,sizeof(vis));
for(i = 0; i < n; i++)
{
scanf("%s",s[i]);
for(j = 0; j < m; j++)
{
if(s[i][j] == 'X')
{
xx.x = i;
xx.y = j;
xx.step = 0;
}
}
}
BFS(xx);
}
return 0;
}