| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 7579 | Accepted: 2544 | 
Description


Input
Output
Sample Input
3 4 YBEB EERE SSTE 0 0
Sample Output
8
Y是自己 B是砖墙(可以打破) S是铁墙(无法通过) R是河流(无法通过) T是敌人 当遇到B花费加2当遇到E花费加1
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define MAX 1100
char map[MAX][MAX];
int vis[MAX][MAX];
int x1,x2,y1,y2;
int n,m;
struct node
{
	int a;
	int b;
	int cost;
	friend bool operator < (node a,node b)
	{
		return a.cost>b.cost;
	}
};
void bfs()
{
	int i,j,t;
	int move[4][2]={0,1,0,-1,-1,0,1,0};
	node beg,end;
	priority_queue<node>q;
	beg.a=x1;
	beg.b=y1;
	beg.cost=0;
	q.push(beg);
	vis[x1][y1]=1;
	while(!q.empty())
	{
		end=q.top();
		q.pop();
		if(end.a==x2&&end.b==y2)
		{
			printf("%d\n",end.cost);
			return ;
		}
		for(i=0;i<4;i++)
		{
			beg.a=end.a+move[i][0];
			beg.b=end.b+move[i][1];
			if(!vis[beg.a][beg.b]&&0<beg.a&&beg.a<=n&&beg.b>0&&beg.b<=m&&map[beg.a][beg.b]!=‘S‘&&map[beg.a][beg.b]!=‘R‘)
			{
				vis[beg.a][beg.b]=1;
				if(map[beg.a][beg.b]==‘B‘)
				beg.cost=end.cost+2;
				else
				beg.cost=end.cost+1;
				q.push(beg);
			}
		}
	}
	printf("-1\n");
}
int main()
{
	int j,i,s,t;
	while(scanf("%d%d",&n,&m)&&n!=0&&m!=0)
	{
		for(i=1;i<=n;i++)
		{
			getchar();
			for(j=1;j<=m;j++)
			{
				scanf("%c",&map[i][j]);
				if(map[i][j]==‘Y‘)
				{
					x1=i;y1=j;
				}
				else if(map[i][j]==‘T‘)
				{
					x2=i;y2=j;
				}
			}
		}
		memset(vis,0,sizeof(vis));
	    bfs();
	}
	return 0;
}
poj 2312 Battle City【bfs+优先队列】
原文:http://www.cnblogs.com/tonghao/p/4687316.html