poj 2312 Battle City

/*
本题就是从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;
}

你可能感兴趣的:(poj 2312 Battle City)