您的位置:首页 > 其它

hdu 2012 A计划

2015-04-02 00:32 295 查看
该题是典型的bfs 和队列的结合~~~

#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct node
{
int x,y,k;
int time;
friend bool operator<(node a,node b)  //优先队列   a小的优先级高
{
return a.time>b.time;
}
};

int biaoji[20][20][2];
int n,m,mox,moy,mok,ti,shix,shiy,shik;
char a[20][20],b[20][20];   //两层楼的情况
int dd[4][2]={0,1,1,0,-1,0,0,-1};  //逆时针方向

int judge(int x,int y,int k)  //判断是否越界 或是 墙
{
if(x>=0&&x<n&&y>=0&&y<m)
{
if(k==0&&a[x][y]!='*')
return 1;
if(k==1&&b[x][y]!='*')
return 1;
}
return 0;
}

int dfs(int shix,int shiy,int shik)
{
priority_queue<node>q;   //优先队列q
node cur,next;
int i,x,y,k;
cur.x=shix;cur.y=shiy;  //当前的坐标
cur.k=shik;cur.time=0;
biaoji[shix][shiy][shik]=1;
q.push(cur);   //当前坐标入队列
while(!q.empty())
{
next=q.top();
q.pop();
if(next.x==mox&&next.y==moy&&next.k==mok)  //位置和层数都在公主坐标处
return next.time;
if(next.time>=ti)
return -100;
for(i=0;i<4;i++)   //四个方向搜索
{
x=next.x+dd[i][0];
y=next.y+dd[i][1];
k=next.k;
if(judge(x,y,k)&&biaoji[x][y][k]==0)  //判断是否越界
{
if(k==0&&a[x][y]=='#')  //原先在第一层且 下一个位置是时光机
{
cur.time=next.time+1;
cur.k=1;
cur.x=x;cur.y=y;
q.push(cur);
biaoji[x][y][1]=1;
continue;
}
if(k==1&&b[x][y]=='#')
{
cur.time=next.time+1;
cur.k=0;
cur.x=x;cur.y=y;
q.push(cur);
biaoji[x][y][0]=1;
continue;
}
cur.time=next.time+1;
cur.k=next.k;
cur.x=x;cur.y=y;
biaoji[x][y][k]=1;
q.push(cur);
}

}

}
return -100;
}
int main()
{
int T,i,j;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&m,&ti);
memset(biaoji,0,sizeof(biaoji));

for(i=0;i<n;i++)
scanf("%s",a[i]);
for(i=0;i<n;i++)
scanf("%s",b[i]);

for(i=0;i<n;i++)
for(j=0;j<m;j++)   //保证不被撞死
{
if(a[i][j]=='#'&&b[i][j]=='#')
{
a[i][j]='*';b[i][j]='*';
}

if(a[i][j]=='#'&&b[i][j]=='*')
a[i][j]='*';

if(a[i][j]=='*'&&b[i][j]=='#')
b[i][j]='*';
}

for(i=0;i<n;i++)
for(j=0;j<m;j++)   //判断哪里是起始点 哪里是终点
{
if(a[i][j]=='P')
{
mox=i;moy=j;mok=0;
}
if(b[i][j]=='P')
{
mox=i;moy=j;mok=1;
}
if(a[i][j]=='S')
{
shix=i;shiy=j;shik=0;
}
if(b[i][j]=='S')
{
shix=i;shiy=j;shik=1;
}
}
int ans;
ans=dfs(shix,shiy,shik);
if(ans<=ti&&ans!=-100)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: