初级啊!!!
x小写。。
记得用优先队列就行了。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define N 202
struct node{ //优先队列
int x,y,step;
friend bool operator<(node n1,node n2)
{
return n2.step <n1.step; // < 栈顶最小 //改1,2即可;
}
};
char map[N][N];
int dir[4][2]={0,1, 0,-1, 1,0, -1,0};
int a,b,sx,sy;
bool judge(int x,int y)
{
if(x>=0 && x<a && y>=0&& y<b&&map[x][y]!='#')
return 1;
return 0;
}
int bfs(int x,int y)
{
priority_queue<node>q;
node cur,next;
int k;
cur.x=x;
cur.y=y;
cur.step=0;
q.push(cur);
map[x][y]='#';
while(!q.empty())
{
cur=q.top();
q.pop();
for(k=0;k<4;k++)
{
next.x=x=cur.x+dir[k][0];
next.y=y=cur.y+dir[k][1];
if(x==sx&&y==sy)
return cur.step+1;
if(judge(x,y))
{
if(map[x][y]=='x')
next.step=cur.step+2;
else
next.step=cur.step+1;
map[x][y]='#';
q.push(next);
}
}
}
return -1;
}
int main ()
{
int x,y,res,i,k;
while(scanf("%d%d",&a,&b)!=EOF)
{
for(i=0;i<a;i++)
{
scanf("%s",map[i]);
for(k=0;k<b;k++)
{
if(map[i][k]=='a') {x=i;y=k;}
if(map[i][k]=='r') {sx=i;sy=k;}
}
}
res=bfs(x,y);
if(res>=0)
printf("%d\n",res);
else
puts("Poor ANGEL has to stay in the prison all his life.");
}
return 0;
}