找朋友
Time Limit: 1000ms Memory limit: 65536K 有疑問?點這裏^_^
題目描述
X,作爲戶外運動的忠實愛好者,總是不想呆在家裏。現在,他想把死宅Y從家裏拉出來。問從X的家到Y的家的最短時間是多少。
爲了簡化問題,我們把地圖抽象爲n*n的矩陣,行編號從上到下爲1 到 n,列編號從左到右爲1 到 n。矩陣中’X’表示X所在的初始座標,’Y’表示Y的位置 , ’#’表示當前位置不能走,’ * ’表示當前位置可以通行。X每次只能向上下左右的相鄰的 ’*’ 移動,每移動一次耗時1秒。
輸入
多組輸入。每組測試數據首先輸入兩個整數n,m(1<= n ,m<=15 )表示地圖大小。接下來的n 行,每行n個字符。保證輸入數據合法。
輸出
若X可以到達Y的家,輸出最少時間,否則輸出 -1。
示例輸入
3 3 X#Y *** #*# 3 3 X#Y *#* #*#
示例輸出
4 -1
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char map[16][16];
int vis[16][16];
int jx[]= {1,0,-1,0};
int jy[]= {0,1,0,-1};
struct node
{
int x,y,ans;
} q[1100];
void bfs(int x,int y,int n,int m )//其中x,y是表示‘X’de 位置座標,
{
int h=0,tl=0;
node t,f;
t.x=x;
t.y=y;
t.ans=0;
vis[t.x][t.y]=1;
q[tl++]=t;//進隊,
while(h<tl)
{
t=q[h++];//把值付給t
if(map[t.x][t.y]=='Y')
{
printf("%d\n",t.ans);
return;
}
for(int i=0; i<4; i++)
{
f.x=t.x+jx[i];
f.y=t.y+jy[i];
if(f.x>=0&&f.x<n&&f.y>=0&&f.y<m&&map[f.x][f.y]!='#'&&vis[f.x][f.y]==0)
{
vis[f.x][f.y]=1;
f.ans=t.ans+1;
q[tl++]=f;//此時再次進隊,循環,再進隊的話最多可以進四步,因爲此時有四步循環,代表四個方向
}
}
}
printf("-1\n");
return;
}
int main()
{
int n,m,i,j;
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
scanf("%*c%s",map[i]);
}
for(i=0;i<n;i++)//這個兩層for循環的作用是爲了找到X的作標。然後跳出,
{
for(j=0;j<m;j++)
{
if(map[i][j]=='X')//如果找到X的話,就跳出
break;
}
if(j!=m)//此刻上面的一成循環跳出,有兩種可能,1是找到X,2是找完了一層,沒有找到,需要繼續找第二層,此時j++,應該等於m,如果不等於m的話,說明找到了X,要跳出。
break;
}
bfs(i,j,n,m);
}
return 0;
}
直到今天,我對此題纔算明白,還有隊列:“先進先出”是說尾巴先進,頭再進,通過下表的的移動來實現的,當head++,時表示下標又向尾巴靠近一步,此時head原來的值就相當於跳出了。