bfs hrbust 1948

我又回來了
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 168(68 users) Total Accepted: 68(58 users) Rating: Special Judge: No
Description

  小輝穿越到了一個很適合他的年代,22222年,他發現雖然他還在地球上,但是這個世界早已不同,經過了世界大破滅,天地大變,已經到了能夠修真的年代,他也加入了一個宗門,少林寺。。。一天,小輝想去找小尼姑們一起快樂地玩耍,他知道這個世界存在着傳送門,在一瞬間就可以從一個地方傳送到另外一個有傳送門的地方,他的老毛病(討厭走路)又犯了,他決定到哪個小尼姑那裏的步數最少,就去找哪個小尼姑。

首先給出小輝和小尼姑所在的N*N平面圖,如圖爲6*6平面圖。

....#.

.*.#..

..@...

######

.@....

......

有Q個小尼姑,每個小尼姑所在的地點用座標表示,左上角處座標爲(0,0)。

圖中'*'代表小輝所在的位置,圖中即(1,1),'.'代表空地,'#'代表不能直接通過的建築物,'@'代表傳送門,傳送門不是不能通過的建築物。

小輝將去找他所能到達的並且離他步數最少的那個小尼姑。

小尼姑的位置可能在除建築物的任意位置上。

Input

有多組測試數據,處理到文件結束。

對於每組測試數據,第一行是兩個整數N(2<=N<=100),Q(1<=Q<=1000),分別代表地區的邊長和小尼姑的個數.

接下來輸入n*n平面圖,代表地區平面圖。

然後Q行,每行一個座標代表小尼姑所在位置。

Output

輸出小輝到那個小尼姑的步數,如果沒有滿足條件的小尼姑,則輸出cry,最後換行.

Sample Input
6 3
....#.
.*.#..
..@...
######
.@....
.....@
0 5
1 4
4 1
3 2
*@.
###
..@
0 2
2 1
Sample Output
2
2
基礎bfs  注意: 走到傳送點但不傳送的時候
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
int vis[105][105];
char map[105][105];
char ans[105][105];
int n,q;
struct node{
	int x,y;
	int step;
};
int xx[4][2] = {1,0,0,1,0,-1,-1,0};
int judge(int x, int y)
{
	if(x>=0&&y>=0&&x<n&&y<n&&map[x][y]!='#') return 1;
	else return 0;
}
void bfs(int begin, int end)
{
	node u,v;
	u.x = begin;
	u.y = end;
	u.step = 0;
	queue<node>s;
	s.push(u);
	while(!s.empty())
	{
		u = s.front();
		s.pop();
		if(ans[u.x][u.y] == '?')
		{
			printf("%d\n",u.step);
			return ;
		 } 
		for(int i = 0; i < 4; i++)
		{
			v = u;
			v.x += xx[i][0];
			v.y += xx[i][1];
			v.step += 1;
			if(judge(v.x,v.y)&&!vis[v.x][v.y])
			{
				vis[v.x][v.y] = 1;
				s.push(v);
				if(map[v.x][v.y] == '@')
					for(int j = 0; j < n; j++)
					for(int k = 0; k < n; k++)
					{
						if(map[j][k] == '@'){
							v.x = j;
							v.y = k;
							s.push(v);
						}
					}
			}
		}
	}
	printf("cry\n");
	return; 
}
int main()
{
	while(~scanf("%d%d",&n,&q))
	{
		int begin,end;
		memset(ans,'!',sizeof ans);
		memset(vis,0,sizeof vis);
		for(int i = 0; i < n; i++)
			scanf("%s",map[i]);
		for(int i = 0; i < n ; i++)
		{
			for(int j = 0; j < n; j++)
			{
				if(map[i][j] == '*')
				{
					begin = i;
					end = j;
				}
			} 
		}
		for(int i = 0; i < q; i++)
		{
			int a,b;
			scanf("%d%d",&a,&b);
			ans[a][b] = '?';
		}
		vis[begin][end] = 1;
		 bfs(begin,end);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章