思路:BFS
坑点:传送门必须是’P’或者’.’才可以过去,否则都是死。
http://acm.hdu.edu.cn/showproblem.php?pid=2102
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = a ; i <= b ; i ++)
#define rrep(i,a,b) for(int i = b ; i >= a ; i --)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long LL;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 2e3+5;
const int MAXE = 1e6+5;
struct Node {
int c,t;
int x,y;
Node(int _c,int _x,int _y,int _t) {
c = _c; x = _x; y = _y; t = _t;
}
};
int T,n,m,k;
char Map[3][15][15];
queue<Node> q;
int fx[] = {0,1,0,-1,0};
int fy[] = {0,0,1,0,-1};
int ok ;
void input() {
scanf("%d %d %d",&n,&m,&k);
rep(j,1,2) rep(i,1,n) {
scanf("%s",Map[j][i]+1);
}
}
void BFS() {
while(!q.empty())q.pop();
q.push(Node(1,1,1,0));
Map[1][1][1] = '*';
while(!q.empty()) {
Node tmp = q.front();
q.pop();
if(tmp.t >= k) break;
rep(i,1,4) {
int tmpx = tmp.x + fx[i];
int tmpy = tmp.y + fy[i];
if(tmpx >= 1 && tmpx <= n && tmpy >= 1 && tmpy <= m )
{
if(Map[tmp.c][tmpx][tmpy] == '.') {
q.push(Node(tmp.c,tmpx,tmpy,tmp.t+1));
Map[tmp.c][tmpx][tmpy] = '*';
}
else if(Map[tmp.c][tmpx][tmpy] == '*') {
}
else if(Map[tmp.c][tmpx][tmpy] == '#') {
Map[tmp.c][tmpx][tmpy] = '*';
if(Map[3-tmp.c][tmpx][tmpy] == '#' || Map[3-tmp.c][tmpx][tmpy] == '#' || Map[3-tmp.c][tmpx][tmpy] == '*') {
}
else {
if(Map[3-tmp.c][tmpx][tmpy] == '.') {
q.push(Node(3-tmp.c,tmpx,tmpy,tmp.t+1));
Map[3-tmp.c][tmpx][tmpy] = '*';
}
else if(Map[3-tmp.c][tmpx][tmpy] == 'P') {
if(tmp.t + 1 <= k) {
ok = 1;
}
return ;
}
}
}
else if(Map[tmp.c][tmpx][tmpy] == 'P') {
if(tmp.t + 1 <= k) {
ok = 1;
}
return ;
}
}
}
}
}
void solve() {
ok = 0;
BFS();
if(ok == 1) {
puts("YES");
}
else {
puts("NO");
}
}
int main(void) {
scanf("%d",&T);
while(T--) {
input();
solve();
}
return 0;
}