poj 2312 Battle City

来源:互联网 发布:重庆seo博客sina 编辑:程序博客网 时间:2024/04/30 14:33
/*本题就是从Y走到T用对长时间,E可直接过,B打一炮才能过(打炮和走格都用时为1),R、S过不去用到优先队列*/#include<stdio.h>#include<queue>using namespace std;char map[310][310];int vis[310][310];int m,n;int sx,sy,ex,ey;int dir[4][2]={-1,0,  0,-1,  1,0,  0,1};struct node{friend bool operator<(node a,node b){return a.step>b.step;}int x,y,step;};void bfs(){priority_queue<node>q;node cur,next;cur.x=sx;cur.y=sy;int i;memset(vis,-1,sizeof(vis));vis[sx][sy]=0;cur.step=0;q.push(cur);while(!q.empty()){cur=q.top();q.pop();for(i=0;i<4;i++){next.x=cur.x+dir[i][0];next.y=cur.y+dir[i][1];if(next.x>=0&&next.x<m&&next.y>=0&&next.y<n){if(map[next.x][next.y]=='E'||map[next.x][next.y]=='T'||map[next.x][next.y]=='B'){if(vis[next.x][next.y]==-1){if(map[next.x][next.y]=='E'){vis[next.x][next.y]=vis[cur.x][cur.y]+1;next.step=cur.step+1;q.push(next);}if(map[next.x][next.y]=='B'){vis[next.x][next.y]=vis[cur.x][cur.y]+2;next.step=cur.step+2;q.push(next);}if(map[next.x][next.y]=='T'){vis[next.x][next.y]=vis[cur.x][cur.y]+1;next.step=cur.step+1;return;}}}}}}}int main(){int i,j;while(scanf("%d%d",&m,&n),m){getchar();for(i=0;i<m;i++)gets(map[i]);for(i=0;i<m;i++)for(j=0;j<n;j++)if(map[i][j]=='Y'){sx=i;sy=j;}else if(map[i][j]=='T'){ex=i;ey=j;}bfs();printf("%d\n",vis[ex][ey]);}return 0;}

原创粉丝点击