HDU 2007-6 Programming Contest
A计划,电影不错,题目也不错。
广度优先搜索,算个伪三维的吧。。
这个有一点独特的就是有传送阵,这一说法,到达传送阵,一定要传送,不能停留原地,而且不花费时间。
做这道题,刚开始要除去一些情况:
两个传送阵互传 or 传送过去是墙
这两种情况让两层相应位置都变成墙。
剩下的按广搜步骤慢慢来,就可以了。
还有一点,判断终点,要记三个坐标,不要只记录两个(只记录x,y的,层数不一样也不行的)
最后不要忘了,有T时刻的要求~。~
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
struct Node
{
int x,y,lev,step;
};
int n,m,t,dis[4][2]={0,1,1,0,0,-1,-1,0};
char mapp[2][15][15];
bool ispos,vis[2][15][15];
void bfs(int x,int y,int level)
{
memset(vis,0,sizeof(vis));
queue <Node> q;
Node pre,lst;
int i;
pre.x=x;
pre.y=y;
pre.lev=level;
pre.step=0;
vis[pre.lev][pre.x][pre.y]=1;
q.push(pre);
while( !q.empty() )
{
pre=q.front();
q.pop();
// 找到公主
if( mapp[pre.lev][pre.x][pre.y]==‘P‘ && pre.step<=t ) {ispos=1;return;}
for(i=0;i<4;++i)
{
lst.x=pre.x+dis[i][0];
lst.y=pre.y+dis[i][1];
lst.step=pre.step+1;
// 时间过了,公主会被吃掉
if( lst.step>t ) continue;
// 下一步越界
if( lst.x<0||lst.y<0||lst.x>=n||lst.y>=m ) continue;
// 下一步走过或者撞墙
if( mapp[pre.lev][lst.x][lst.y]==‘*‘ || vis[pre.lev][lst.x][lst.y]==1 ) continue;
// 如果下一步到达传送阵
if( mapp[pre.lev][lst.x][lst.y]==‘#‘)
{
lst.lev=(pre.lev+1)%2;
vis[pre.lev][lst.x][lst.y]=1;
q.push(lst);
continue;
}
vis[pre.lev][lst.x][lst.y]=1;
lst.lev=pre.lev;
q.push(lst);
}
}
}
int main()
{
int test,i,j,k;
cin>>test;
while( test-- )
{
cin>>n>>m>>t;
for(k=0;k<2;++k)
for(i=0;i<n;++i)
for(j=0;j<m;++j)
cin>>mapp[k][i][j];
// 将没必要的全去掉
for(i=0;i<n;++i)
{
for(j=0;j<m;++j)
{
if(mapp[0][i][j]==‘#‘)
if(mapp[1][i][j]==‘*‘ || mapp[1][i][j]==‘#‘)
mapp[0][i][j]=mapp[1][i][j]=‘*‘;
if(mapp[1][i][j]==‘#‘)
if(mapp[0][i][j]==‘*‘ || mapp[0][i][j]==‘#‘)
mapp[0][i][j]=mapp[1][i][j]=‘*‘;
}
}
ispos=0;
bfs(0,0,0);
if(ispos) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
原文地址:http://blog.csdn.net/lttree/article/details/24598165