http://acm.hdu.edu.cn/showproblem.php?pid=2102
复习了一遍队列,借鉴了网上的一些不错的方法,学习了!
View Code
#include<iostream>
#include<cstdio>
#include<queue>
#define M 11
using namespace std;
char map[2][M][M];
int set[2][M][M];
int Dir[4][2]={{1 , 0},{0 , 1},{-1 , 0},{0 , -1}};
int n,m,t;
int mx,my,mz;
int i,j,k;
struct Maze
{
int x,y,z;
int step;
};
Maze P , S;
void Init()
{
for(i=0 ; i<2; ++i)
for(j=0 ; j<n; ++j)
for(k=0 ; k<m; ++k)
set[i][j][k]=0x7fffffff;
set[0][0][0]=0;
}
void BFS()
{
queue<Maze>Q;
P.x=0;
P.y=0;
P.z=0;
P.step=0;
Q.push(P);
Init();
while(!Q.empty())
{
P=Q.front();
Q.pop();
if(P.x==mx && P.y==my && P.z==mz && P.step <= t)
{
printf("YES\n");
return ;
}
for( i=0; i<4 ; ++i)
{
S = P;
S.x=S.x+Dir[i][0];
S.y=S.y+Dir[i][1];
S.step++;
if(S.x>=0 && S.y>=0 && S.x<n && S.y<m && map[S.z][S.x][S.y]!='*' && S.step<=t)
{
if(map[S.z][S.x][S.y]=='#')
{
S.z=(!S.z);
if(map[S.z][S.x][S.y]!='*')
{
if(map[S.z][S.x][S.y]!='#' && set[S.z][S.x][S.y]>=S.step)
{
set[S.z][S.x][S.y] = S.step;
Q.push(S);
}
}
}
else
{
if(set[S.z][S.x][S.y] >= S.step)
{
set[S.z][S.x][S.y] = S.step;
Q.push(S);
}
}
}
}
}
printf("NO\n");
}
int main()
{
int ii,jj,kk;
int w;
scanf("%d" ,&w);
while(w--)
{
scanf("%d%d%d",&n,&m,&t);
for(ii=0 ; ii<2 ; ++ii)
{for(jj=0 ; jj<n ; ++jj )
{
scanf("%s",&map[ii][jj]);
for(kk=0 ; kk<m ; ++kk )
{
if(map[ii][jj][kk] == 'P')
{
mz=ii;mx=jj;my=kk;
}
}
}}
BFS();
}
return 0;
}