#include #include const int MAX=205; using namespace std; typedef struct node { int x,y; int step; node(int a=0) :step(a) {}; friend bool operator < (const struct node &n1, const struct node &n2) { return n1.step>n2.step; } }N; int n,m,ex,ey;//n为行,ex,ey天使的位置 char map[MAX][MAX]; bool visited[MAX][MAX]; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};//上,右,下,左 void init() { memset(visited,false,sizeof(visited)); } int BFS(int x,int y) { priority_queue Q; N pre,cur; pre.x=x,pre.y=y; pre.step=0; Q.push(pre); visited[pre.x][pre.y]=true; while(!Q.empty()) { pre=Q.top(); Q.pop(); for(int i=0;i<4;i++) { cur=pre; cur.x+=dir[i][0]; cur.y+=dir[i][1]; cur.step++; if(visited[cur.x][cur.y]==false && cur.x>=1 && cur.x<=n && cur.y>=1 && cur.y<=m && map[cur.x][cur.y]!='#') { if(map[cur.x][cur.y]=='r') return cur.step; if(map[cur.x][cur.y]=='x') cur.step++; visited[cur.x][cur.y]=true; Q.push(cur); } } } return -1;//找不到 } int main(void) { while(scanf("%d%d",&n,&m)==2) { init(); int i,j,flag=1; for(i=1;i<=n;i++) { scanf("%s",map[i]+1); for(j=1;j<=m;j++) { if(map[i][j]=='a') { ex=i; ey=j; } if(map[i][j]=='r') flag=0; } } int ans=BFS(ex,ey); if(ans==-1 || flag==1) cout<
题目大意: 先略。 解题思路: 一般的广度wa,改为用优先队列就搞定了。 代码:
转载于:https://www.cnblogs.com/cchun/archive/2011/12/03/2520200.html