题意:中文的,不解释........
解题思路:先处理地图,然后就是普通的广搜问题了。
反思:本来想秀操作,结果水了...................
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,tt;
int dx,dy,dz;
int Dx[]= {0,1,0,-1},
Dy[]= {1,0,-1,0};
bool vis[2][11][11];
char a[2][11][11];
struct AC
{
int x,y;
int ceng;
int t;
};
bool judge(int z,int x,int y)
{
if(x>=n||x<0||y>=m||y<0||a[z][x][y]=='*'||vis[z][x][y])
return false;
return true;
}
void bfs()
{
queue<AC> Q;
AC t,t1;
t.x=0;
t.t=0;
t.y=0;
t.ceng=0;
Q.push(t);
while(!Q.empty())
{
t=Q.front();
// printf("now---->at(%d,%d,%d) then the time is (%d) \n",t.ceng,t.x,t.y,t.t);
Q.pop();
if(t.t>tt) continue;
if(a[t.ceng][t.x][t.y]=='*') continue;
if(t.x==dx&&t.y==dy&&t.ceng==dz)
{
puts("YES");
return ;
}
for(int i=0; i<4; i++)
{
int xx=t.x+Dx[i];
int yy=t.y+Dy[i];
if(a[t.ceng][xx][yy]=='#') t1.ceng=!t.ceng;
else t1.ceng=t.ceng;
if(judge(t1.ceng,xx,yy))
{
vis[t1.ceng][xx][yy]=1;
t1.x=xx;
t1.t=t.t+1;
t1.y=yy;
if(a[t1.ceng][xx][yy]=='*') ;else
Q.push(t1);
}
}
}
puts("NO");
return ;
}
int main()
{
// freopen("in.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d",&n,&m,&tt);
for(int xx=0;xx<2;xx++)
for(int i=0; i<n; i++)
{
scanf("%s",a[xx][i]);
for(int j=0; j<m; j++)
if(a[xx][i][j]=='P')
dx=i,dy=j,dz=xx;
}
for(int i=0; i<2; i++)
{
for(int j=0; j<n; j++)
{
for(int k=0; k<m; k++)
if(a[i][j][k]=='#')
{
if(a[!i][j][k]=='*') a[i][j][k]='*';
if(a[!i][j][k]=='#') a[i][j][k]=a[!i][j][k]='*';
}
}
}
// for(int xx=0;xx<2;xx++)
// for(int i=0;i<n;i++)
// printf("!%s!\n",a[xx][i]);
// printf("asdasd %c\n\n\n\n\n",a[1][1][2]);
memset(vis,false,sizeof(vis));
vis[0][0][0]=1;
bfs();
}
}
注意预处理地图,而且要认真。AC就是这么简单