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; }
相关文章推荐