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: 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;
}