Description
可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验。魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老。年迈的国王正是心急如焚,告招天下勇士来拯救公主。不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示。骑士们一进入时空传输机就会被转到另一层的相对位置,但如果被转到的位置是墙的话,那骑士们就会被撞死。骑士们在一层中只能前后左右移动,每移动一格花1时刻。层间的移动只能通过时空传输机,且不需要任何时间。
现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是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
// File Name: A计划.cpp
// Author: rudolf
// Created Time: 2013年03月13日 星期三 22时37分27秒include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#define MAX 20
using namespace std;
char map1[MAX][MAX][MAX];
int map11[MAX][MAX][MAX];
int cen,x,y;
int visit[MAX][MAX][MAX];
int x_add[4]={-1,1,0,0};
int y_add[4]={0,0,-1,1};
int n,m,t;
int sum;
struct
{
int cen1,x,y;
}q[101];
int flag;
///////////////
//int bfs(int cen0,int x0,int y0,int cen,int x,int y)
int bfs(int cen0,int x0,int y0)
{
int xx,yy;
//cout<<"a";
memset(visit,0,sizeof(visit));
int rear=0,front=0;
q[rear].cen1=cen0;
q[rear].x=x0;
q[rear++].y=y0;
while(rear!=front)
{
// front++;
if(q[front].cen1==cen&&q[front].x==x&&q[front].y==y)
return 1;
front++;
}
for(int i=0;i<4;i++)
{
xx=x0+x_add[i];
yy=y0+y_add[i];
if(map1[cen0][xx][yy]=='#')
{
sum++;
// cout<<sum;
cen0=!cen0;
if(map1[cen0][xx][yy]=='*')
{
flag=1;
return 0;
}
}
// sum++;
// cout<<sum;
if(map1[cen0][xx][yy]=='.')
{
sum++;
if(!visit[cen0][xx][yy])
{
// sum++;
//cout<<sum;
visit[cen0][xx][yy]=1;
}
// sum++;
// cout<<sum;
//bfs(cen0,xx,yy,cen,x,y);
// bfs(cen0,xx,yy);
}
// sum++;
cout<<sum;
}
bfs(cen0,xx,yy);
}
//////////////
int main()
{
// int n,m,t;
//int cen,x,y;
sum=0;
cin>>n>>m>>t;
for(int z=0;z<2;z++)
for(int i=0;i<n;i++)
{
// cout<<z;
for(int j=0;j<m;j++)
{
cin>>map1[z][i][j];
if(map1[z][i][j]=='*')
visit[z][i][j]=1;
map11[z][i][j]=map1[z][i][j]-'a';
// cout<<map1[i][j][z];
if(map1[z][i][j]=='P')
{
cen=z,x=i,y=j;
/// cout<<cen<<x<<y;
}
if(map1[z][i][j]=='S')
{
int cen0=z;
int x0=i;
int y0=j;
/// cout<<cen0<<x0<<y0;
}
//cout<<cen<<x<<y;
}
// cout<<endl;
}
flag=0;
//bfs(0,0,0,cen,x,y);
bfs(0,0,0);
// cout<<sum;
// cout<<"aaaaaaaaaaaaaaaaa";
if(flag||sum>t)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
return 0;
}
// File Name: A计划1.cpp
// Author: rudolf
// Created Time: 2013年03月14日 星期四 21时12分33秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define MAX 20
using namespace std;
char map1[2][MAX][MAX],mark[2][MAX][MAX];
int dist[4][2]={0,1,0,-1,1,0,-1,0};
//char map1[MAX][MAX],mark[MAX][MAX];
int n,m,t;
int cen0,xx,yy;
struct node
{
int cen;
int x,y,step;
};
//int bfs(int cc,int aa,int b)
//int bfs(int aa,int bb)
void judge()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char &a=map1[0][i][j],&b=map1[1][i][j];
if(a=='#'&&b=='#')
{
a=b='*';
}
else if((a=='*'&&b=='#')||(a=='#'&&b=='*'))
{
a=b='*';
}
}
}
////////////////
int bfs()
{
// cout<<"aaaaaaaaaaaa";
queue<node> p;
node cur,next;
memset(mark,0,sizeof(mark));
cur.cen=0;
cur.x=0;
cur.y=0;
cur.step=0;
// memset(mark,0,sizeof(mark));
p.push(cur);
mark[0][0][0]=1;
// if(cur.cen==cen0&&cur.x==xx&&cur.y==yy)
// cout<<"YES";
// if(cur.x==xx&&cur.y==yy)
// return cur.step;
// p.push(cur);
while(!p.empty())
{
cur=p.front();
p.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+dist[i][0];
next.y=cur.y+dist[i][1];
next.cen=cur.cen;
if(next.x<0||next.y<0||next.x>=n||next.y>=m)
continue;
if(map1[next.cen][next.x][next.y]=='*'||mark[next.cen][next.x][next.y])
continue;
if(map1[next.cen][next.x][next.y]=='#')
{
next.cen=!next.cen;
// if(map1[next.cen][next.x][next.y]=='*')
// return -1;
// continue;
// }
if(mark[next.cen][next.x][next.y])
continue;
}
if(map1[next.cen][next.x][next.y]=='P')
return cur.step+1;
next.step=cur.step+1;
mark[next.cen][next.x][next.y]=1;
p.push(next);
}
}
return -1;
}
int main()
{
int Case;
int i,j,z,k;
//int n,m,t;
cin>>Case;
while(Case--)
{
cin>>n>>m>>t;
//memset(mark,0,sizeof(mark));
memset(map1,0,sizeof(map1));
for(k=0;k<2;k++)
{
for(i=0;i<n;i++)
scanf("%s",map1[k][i]);
if(!k)
getchar();
}
judge();
// bfs();
int ans=bfs();
//cout<<ans;
if(ans==-1||ans>t)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
// File Name: ajihua.cpp
// Author: rudolf
// Created Time: 2013年03月18日 星期一 17时47分37秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
const int MAX=11;
using namespace std;
char map1[2][MAX][MAX];
int mark[2][MAX][MAX];
int dist[4][2]={-1,0,1,0,0,-1,0,1};
int n,m,t;
struct node
{
int x,y,cen,step;
};
void judge()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char &a=map1[0][i][j];
char &b=map1[1][i][j];
if(a=='#'&&b=='#')
a=b='*';
else
{
if((a=='#'&&b=='*')||(a=='*'&&b=='#'))
a=b='*';
}
}
// getchar();
//cout<<"aaaaaaaaaaaaaaaa";
}
int bfs()
{
// cout<<"aaaaaaaaaaaaaaaaa";
queue<node> Q;
node cur,p,q,next;
memset(mark,0,sizeof(mark));
cur.x=0;
cur.y=0;
cur.cen=0;
cur.step=0;
Q.push(cur);
// Q.pop();
mark[0][0][0]=1;
while(!Q.empty())
{
cur=Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+dist[i][0];
next.y=cur.y+dist[i][1];
next.cen=cur.cen;
if(next.x<0||next.y<0||next.x>=n||next.y>=m)
continue;
if(mark[next.cen][next.x][next.y]||map1[next.cen][next.x][next.y]=='*')
continue;
if(map1[next.cen][next.x][next.y]=='#')
{
next.cen=!next.cen;
if(mark[next.cen][next.x][next.y])
continue;
}
if(map1[next.cen][next.x][next.y]=='P')
return cur.step+1;
next.step=cur.step+1;
mark[next.cen][next.x][next.y]=1;
Q.push(next);
}
}
return -1;
}
int main()
{
int N;
int i,j,k,z;
// int n,m,t;
cin>>N;
while(N--)
{
cin>>n>>m>>t;
memset(map1,0,sizeof(map1));
for(z=0;z<2;z++)
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>map1[z][i][j];
// cout<<"aaaaaaaaaaaaaaaaaa";
// getchar();
judge();
int ans=bfs();
if(ans>t||ans==-1)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
// File Name: A计划1.cpp
// Author: rudolf
// Created Time: 2013年03月14日 星期四 21时12分33秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define MAX 20
using namespace std;
char map1[2][MAX][MAX],mark[2][MAX][MAX];
int dist[4][2]={0,1,0,-1,1,0,-1,0};
//char map1[MAX][MAX],mark[MAX][MAX];
int n,m,t;
int cen0,xx,yy;
struct node
{
int cen;
int x,y,step;
};
//int bfs(int cc,int aa,int b)
//int bfs(int aa,int bb)
void judge()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char &a=map1[0][i][j],&b=map1[1][i][j];
if(a=='#'&&b=='#')
{
a=b='*';
}
else if((a=='*'&&b=='#')||(a=='#'&&b=='*'))
{
a=b='*';
}
}
}
int bfs()
{
queue<node> p;
node cur,next;
memset(mark,0,sizeof(mark));
cur.cen=0;
cur.x=0;
cur.y=0;
cur.step=0;
p.push(cur);
mark[0][0][0]=1;
while(!p.empty())
{
cur=p.front();
p.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+dist[i][0];
next.y=cur.y+dist[i][1];
next.cen=cur.cen;
if(next.x<0||next.y<0||next.x>=n||next.y>=m)
continue;
if(map1[next.cen][next.x][next.y]=='*'||mark[next.cen][next.x][next.y])
continue;
if(map1[next.cen][next.x][next.y]=='#')
{
next.cen=!next.cen;
if(mark[next.cen][next.x][next.y])
continue;
}
if(map1[next.cen][next.x][next.y]=='P')
return cur.step+1;
next.step=cur.step+1;
mark[next.cen][next.x][next.y]=1;
p.push(next);
}
}
return -1;
}
int main()
{
int Case;
int i,j,z,k;
cin>>Case;
while(Case--)
{
cin>>n>>m>>t;
memset(map1,0,sizeof(map1));
/* for(k=0;k<2;k++)
{
for(i=0;i<n;i++)
scanf("%s",map1[k][i]);
if(!k)
getchar();
}*/
for(k=0;k<2;k++)
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>map1[k][i][j];
judge();
int ans=bfs();
if(ans==-1||ans>t)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}
// File Name: A计划.cpp
// Author: rudolf
// Created Time: 2013年03月13日 星期三 22时37分27秒include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#define MAX 20
using namespace std;
char map1[MAX][MAX][MAX];
int map11[MAX][MAX][MAX];
int cen,x,y;
int visit[MAX][MAX][MAX];
int x_add[4]={-1,1,0,0};
int y_add[4]={0,0,-1,1};
int n,m,t;
int sum;
struct
{
int cen1,x,y;
}q[101];
int flag;
///////////////
//int bfs(int cen0,int x0,int y0,int cen,int x,int y)
int bfs(int cen0,int x0,int y0)
{
int xx,yy;
//cout<<"a";
memset(visit,0,sizeof(visit));
int rear=0,front=0;
q[rear].cen1=cen0;
q[rear].x=x0;
q[rear++].y=y0;
while(rear!=front)
{
// front++;
if(q[front].cen1==cen&&q[front].x==x&&q[front].y==y)
return 1;
front++;
}
for(int i=0;i<4;i++)
{
xx=x0+x_add[i];
yy=y0+y_add[i];
if(map1[cen0][xx][yy]=='#')
{
sum++;
// cout<<sum;
cen0=!cen0;
if(map1[cen0][xx][yy]=='*')
{
flag=1;
return 0;
}
}
// sum++;
// cout<<sum;
if(map1[cen0][xx][yy]=='.')
{
sum++;
if(!visit[cen0][xx][yy])
{
// sum++;
//cout<<sum;
visit[cen0][xx][yy]=1;
}
// sum++;
// cout<<sum;
//bfs(cen0,xx,yy,cen,x,y);
// bfs(cen0,xx,yy);
}
// sum++;
cout<<sum;
}
bfs(cen0,xx,yy);
}
//////////////
int main()
{
// int n,m,t;
//int cen,x,y;
sum=0;
cin>>n>>m>>t;
for(int z=0;z<2;z++)
for(int i=0;i<n;i++)
{
// cout<<z;
for(int j=0;j<m;j++)
{
cin>>map1[z][i][j];
if(map1[z][i][j]=='*')
visit[z][i][j]=1;
map11[z][i][j]=map1[z][i][j]-'a';
// cout<<map1[i][j][z];
if(map1[z][i][j]=='P')
{
cen=z,x=i,y=j;
/// cout<<cen<<x<<y;
}
if(map1[z][i][j]=='S')
{
int cen0=z;
int x0=i;
int y0=j;
/// cout<<cen0<<x0<<y0;
}
//cout<<cen<<x<<y;
}
// cout<<endl;
}
flag=0;
//bfs(0,0,0,cen,x,y);
bfs(0,0,0);
// cout<<sum;
// cout<<"aaaaaaaaaaaaaaaaa";
if(flag||sum>t)
{
cout<<"NO"<<endl;
}
else
{
cout<<"YES"<<endl;
}
return 0;
}
// File Name: A计划1.cpp
// Author: rudolf
// Created Time: 2013年03月14日 星期四 21时12分33秒
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<queue>
#define MAX 20
using namespace std;
char map1[2][MAX][MAX],mark[2][MAX][MAX];
int dist[4][2]={0,1,0,-1,1,0,-1,0};
//char map1[MAX][MAX],mark[MAX][MAX];
int n,m,t;
int cen0,xx,yy;
struct node
{
int cen;
int x,y,step;
};
//int bfs(int cc,int aa,int b)
//int bfs(int aa,int bb)
void judge()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char &a=map1[0][i][j],&b=map1[1][i][j];
if(a=='#'&&b=='#')
{
a=b='*';
}
else if((a=='*'&&b=='#')||(a=='#'&&b=='*'))
{
a=b='*';
}
}
}
////////////////
int bfs()
{
// cout<<"aaaaaaaaaaaa";
queue<node> p;
node cur,next;
memset(mark,0,sizeof(mark));
cur.cen=0;
cur.x=0;
cur.y=0;
cur.step=0;
// memset(mark,0,sizeof(mark));
p.push(cur);
mark[0][0][0]=1;
// if(cur.cen==cen0&&cur.x==xx&&cur.y==yy)
// cout<<"YES";
// if(cur.x==xx&&cur.y==yy)
// return cur.step;
// p.push(cur);
while(!p.empty())
{
cur=p.front();
p.pop();
for(int i=0;i<4;i++)
{
next.x=cur.x+dist[i][0];
next.y=cur.y+dist[i][1];
next.cen=cur.cen;
if(next.x<0||next.y<0||next.x>=n||next.y>=m)
continue;
if(map1[next.cen][next.x][next.y]=='*'||mark[next.cen][next.x][next.y])
continue;
if(map1[next.cen][next.x][next.y]=='#')
{
next.cen=!next.cen;
// if(map1[next.cen][next.x][next.y]=='*')
// return -1;
// continue;
// }
if(mark[next.cen][next.x][next.y])
continue;
}
if(map1[next.cen][next.x][next.y]=='P')
return cur.step+1;
next.step=cur.step+1;
mark[next.cen][next.x][next.y]=1;
p.push(next);
}
}
return -1;
}
int main()
{
int Case;
int i,j,z,k;
//int n,m,t;
cin>>Case;
while(Case--)
{
cin>>n>>m>>t;
//memset(mark,0,sizeof(mark));
memset(map1,0,sizeof(map1));
for(k=0;k<2;k++)
{
for(i=0;i<n;i++)
scanf("%s",map1[k][i]);
if(!k)
getchar();
}
judge();
// bfs();
int ans=bfs();
//cout<<ans;
if(ans==-1||ans>t)
cout<<"NO"<<endl;
else
cout<<"YES"<<endl;
}
return 0;
}