hdu 1180 bfs(奇偶性)

来源:互联网 发布:电脑包推荐 知乎 编辑:程序博客网 时间:2024/05/18 13:09

点击打开链接

#include <iostream>#include <algorithm>#include <queue>#include <cstring>using namespace std;const int M=30;typedef struct{int x2;int y2;}MOVE;MOVE Move[4]={{-1,0},{0,-1},{1,0},{0,1}};struct Node{int x;int y;int time;Node(int x1,int y1,int d):x(x1),y(y1),time(d){}Node(){}bool operator < (const Node &t) const       { return time > t.time; }};int m,n,visit[M][M],num,sx,sy,ex,ey;char g[M][M];bool check(int a,int b){if(a>=0&&a<m&&b>=0&&b<n&&!visit[a][b]&&g[a][b]!='*')return 1;elsereturn 0;}void bfs(){priority_queue<Node> q;q.push(Node(sx,sy,0)); // 时间递增 int cur;int i,j,a,b,x1,y1;while(!q.empty()){Node t=q.top();q.pop();x1=t.x;y1=t.y;cur=t.time;if(g[x1][y1]=='T'){cout<<cur<<endl;return;}for(i=0;i<4;i++){a=x1+Move[i].x2;b=y1+Move[i].y2;if(check(a,b)){if(g[a][b]=='|'||g[a][b]=='-'){if(cur%2==0) //利用时间的奇偶性判断 ladder的状态 偶数原样 奇数相反 {if((g[a][b]=='|'&&i%2==0)||(g[a][b]=='-'&&i%2)){j=1;}else{j=2; //要等待一秒 }a=a+Move[i].x2;b=b+Move[i].y2;if(check(a,b)){visit[a][b]=1;q.push(Node(a,b,cur+j));}}else{if((g[a][b]=='|'&&i%2)||(g[a][b]=='-'&&i%2==0)) // 梯子变换了 {j=1;}else{j=2; //要等待一秒 }a=a+Move[i].x2;b=b+Move[i].y2;if(check(a,b)){visit[a][b]=1;q.push(Node(a,b,cur+j));}}}else{visit[a][b]=1;q.push(Node(a,b,t.time+1));}}}}}int main(){while(cin>>m>>n){memset(visit,0,sizeof(visit));int i,j;for(i=0;i<m;i++){for(j=0;j<n;j++){cin>>g[i][j];if(g[i][j]=='S'){sx=i;sy=j;}}}bfs();} return 0;}


0 0