hdu2102

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;
}
原文地址:https://www.cnblogs.com/FCWORLD/p/2028639.html