/*
D - A计划
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。
魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,
告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,
时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,
但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。
层间的移动只能通过时空传输机,且不需要任何时间。
Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(
1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置
情况。
Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
Sample Input
1
5 5 14
S*#*.
.#...
.....
****.
...#.
..*.P
#.*..
***..
...*.
*.#..
Sample Output
YES
公主的位置用P表示,
时空传输机用#表示,墙用*表示,平地用.表示。
D - A计划
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
Submit Status
Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。
魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,
告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,
时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,
但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。
层间的移动只能通过时空传输机,且不需要任何时间。
Input
输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(
1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置
情况。
Output
如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。
Sample Input
1
5 5 14
S*#*.
.#...
.....
****.
...#.
..*.P
#.*..
***..
...*.
*.#..
Sample Output
YES
公主的位置用P表示,
时空传输机用#表示,墙用*表示,平地用.表示。
*/
/*
广搜: 四个方向搜索
其中注意的是传送的时候:
1.第一层当下的位置是传送机,第二层同样的位置是墙 -->去的时候撞死
2.第一层当下的位置是墙,第二层同样的位置是传送机 -->回去的时候撞死
3.第一层当下的位置是传送机,第二层同样的位置也是传送机 -->不停传送
这三种情况 初始一下,都给它设置为墙
*/
#include <stdio.h>
#include <string.h>
#include <queue>
using namespace std;
struct Node
{
int x;
int y;
int z;
int count;
};
char map[4][12][12];
int used[4][12][12];
void init()
{
memset(map,'*',sizeof(map));
memset(used,0,sizeof(used));
}
int main()
{
int c;
scanf("%d",&c);
while(c--)
{
queue<Node>Q;
Node start;
int m,n,t,i,j,k;
scanf("%d%d%d",&n,&m,&t);
init();
for(i=1;i<=2;i++)
{
for(j=1;j<=n;j++)
{
scanf("%s",&map[i][j][1]); //从数组第二列开始读数,第一行设置为墙。
for(k=1;k<=m;k++)
{
if(map[i][j][k]=='S') //找到起始位置
{
start.x = i;
start.y = j;
start.z = k;
start.count = 0;
used[i][j][k] = 1;
Q.push(start);
}
}
}
}
for(j=1;j<=n;j++) //三种特殊情况
{
for(k=1;k<=m;k++)
{
if(map[1][j][k]=='#' && map[2][j][k]=='*' || map[1][j][k]=='*' && map[2][j][k]=='#'|| map[1][j][k]=='#' && map[2][j][k]=='#')
{
map[1][j][k] = map[2][j][k] = '*';
}
}
}
int f = 0;
while(!Q.empty()) //开始广搜
{
start = Q.front();
Q.pop();
i = start.x;
j = start.y;
k = start.z;
if(map[i][j][k] == 'P' && start.count<=t)
{
f = 1;
printf("YES\n");
break;
}
start.count ++ ;
start.x = i;
start.y = j + 1;
start.z = k;
if(map[start.x][start.y][start.z]!='*' && !used[start.x][start.y][start.z] && start.count<=t)
{
if(map[start.x][start.y][start.z]=='#')
{
used[start.x][start.y][start.z] = 1;
start.x = start.x % 2 + 1;
}
used[start.x][start.y][start.z] = 1;
Q.push(start);
}
start.x = i;
start.y = j - 1;
start.z = k;
if(map[start.x][start.y][start.z]!='*' && !used[start.x][start.y][start.z] && start.count<=t)
{
if(map[start.x][start.y][start.z]=='#')
{
used[start.x][start.y][start.z] = 1;
start.x = start.x % 2 + 1;
}
used[start.x][start.y][start.z] = 1;
Q.push(start);
}
start.x = i;
start.y = j;
start.z = k + 1;
if(map[start.x][start.y][start.z]!='*' && !used[start.x][start.y][start.z] && start.count<=t)
{
if(map[start.x][start.y][start.z]=='#')
{
used[start.x][start.y][start.z] = 1;
start.x = start.x % 2 + 1;
}
used[start.x][start.y][start.z] = 1;
Q.push(start);
}
start.x = i;
start.y = j;
start.z = k - 1;
if(map[start.x][start.y][start.z]!='*' && !used[start.x][start.y][start.z] && start.count<=t)
{
if(map[start.x][start.y][start.z]=='#')
{
used[start.x][start.y][start.z] = 1;
start.x = start.x % 2 + 1;
}
used[start.x][start.y][start.z] = 1;
Q.push(start);
}
}
if(!f)
{
printf("NO\n");
}
}
return 0;
}