{{{ #!cplusplus /* zju 1649 ,hdu 1242 最短路径 BFS ymc 2008/9/17 题目大意: 在一个n×m的地图上,天使用a表示,天使的一些朋友用r表示。#表示墙,.表示路。 x表示有一个守卫。r可以上下左右移动,每次只能移动一个点,需要1的时间。如果移到 x的位置,需要额外1的时间杀掉x。 求从r到a的最小时间 解题思路: 求所有r到其它点的的最短距离。 dist[i][j]记录所有r到点i,j的最短距离,所有r的dist为0. used标记点i,j的最短距离是否已经求出。用BFS搜索a的距离。 */ #include #include using namespace std; const int N=300; int dist[N][N]; char graph[N][N]; int step[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct Pt { int x,y; int d; Pt(int xx=0,int yy=0,int dd=-1) { x=xx;y=yy;d=dd; } bool operator<(const Pt &p)const { return d>p.d; } }; int n,m; int ax,ay; void BFS() { priority_queue q; for(int i=0;i=n||y1<0||y1>=m) continue; if(dist[x1][y1]>=0||graph[x1][y1]=='#') continue; if(graph[x1][y1]=='x') dist[x1][y1]=dist[u.x][u.y]+2; else dist[x1][y1]=dist[u.x][u.y]+1; q.push(Pt(x1,y1,dist[x1][y1])); } } } int main() { while(cin>>n>>m) { for(int i=0;i>graph[i][j]; BFS(); if(dist[ax][ay]>=0) cout<