HDU-2102-A計劃


title: HDU-2102-A計劃
categories:

  • ACM
  • BFS
    tags:
  • 易錯題
  • 標誌數組做記錄
    date: 2020-03-03 10:39:56

兩層迷宮,‘#’代表瞬時傳送裝置,如果傳送後是牆則撞死,如果傳送後是‘#’,則一直在傳送,必須考慮這兩種情況。

題目

A計劃

*Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 38233 Accepted Submission(s): 9470
*

Problem Description

可憐的公主在一次次被魔王擄走一次次被騎士們救回來之後,而今,不幸的她再一次面臨生命的考驗。魔王已經發出消息說將在T時刻喫掉公主,因爲他聽信謠言說喫公主的肉也能長生不老。年邁的國王正是心急如焚,告招天下勇士來拯救公主。不過公主早已習以爲常,她深信智勇的騎士LJ肯定能將她救出。
現據密探所報,公主被關在一個兩層的迷宮裏,迷宮的入口是S(0,0,0),公主的位置用P表示,時空傳輸機用#表示,牆用*表示,平地用.表示。騎士們一進入時空傳輸機就會被轉到另一層的相對位置,但如果被轉到的位置是牆的話,那騎士們就會被撞死。騎士們在一層中只能前後左右移動,每移動一格花1時刻。層間的移動只能通過時空傳輸機,且不需要任何時間。

Input

輸入的第一行C表示共有C個測試數據,每個測試數據的前一行有三個整數N,M,T。 N,M迷宮的大小NM(1 <= N,M <=10)。T如上所意。接下去的前NM表示迷宮的第一層的佈置情況,後N*M表示迷宮第二層的佈置情況。

Output

如果騎士們能夠在T時刻能找到公主就輸出“YES”,否則輸出“NO”。

Sample Input

1
5 5 14
S*#*.
.#...
.....
****.
...#.

..*.P
#.*..
***..
...*.
*.#..

Sample Output

YES

算法

#include<stdio.h>
#include<iostream>
#include<string.h>
#include <queue>
#include<math.h>
using namespace std;
struct Point
{
	int x,y,z;
} a,b;
int dir[4][2]={1,0,-1,0,0,1,0,-1};
int m,n,t,zx,zy,zz;
char map[2][10][10];
int v[2][10][10];
void bfs(){
	memset(v,0,sizeof(v));
	v[0][0][0]=1;
	a.x=0;a.y=0;a.z=0;
	queue<Point> q;
	q.push(a);
	while(!q.empty())
	{
		a=q.front();
		q.pop();
		for(int i=0;i<4;i++)
		{
			b.x=a.x;
			b.y=a.y+dir[i][0];
			b.z=a.z+dir[i][1];
			if(b.y>=0&&b.y<m&&b.z>=0&&b.z<n&&map[b.x][b.y][b.z]!='*'&&v[b.x][b.y][b.z]==0)
			{
				v[b.x][b.y][b.z]=v[a.x][a.y][a.z]+1;
				if(map[b.x][b.y][b.z]=='#')
				{
					int tt=v[b.x][b.y][b.z];
					b.x=(b.x==1?0:1);
					if(map[b.x][b.y][b.z]=='*'||map[b.x][b.y][b.z]=='#') continue;
					v[b.x][b.y][b.z]=tt;
				}
				if(v[b.x][b.y][b.z]-1>t){cout<<"NO"<<endl;return;}
				if(map[b.x][b.y][b.z]=='P') {cout<<"YES"<<endl; return;}
				q.push(b);
			}
		}
	}
	cout<<"NO"<<endl;
	
}
int main()
{
	//freopen("input.txt", "r", stdin);
	int c;
	cin>>c;
	while(c--){
		cin>>m>>n>>t;
		for(int k=0;k<2;k++)
			for(int i=0;i<m;i++)
				for(int j=0;j<n;j++)
					cin>>map[k][i][j];
		bfs();
	}
	return 0;
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章