hnu 1242 Rescue
题意就是Angel困在监狱中 有朋友去救她 遇到保卫 就Kill且时间+1 走一步时间+1
求最后所需最少的时间 另外还有可能救不出来
代码如下:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <queue>
#define eps 1e-8
#define op operator
#define MOD 10009
#define MAXN 100100
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define FOV(i,a,b) for(int i=a;i>=b;i--)
#define REP(i,a,b) for(int i=a;i<b;i++)
#define REV(i,a,b) for(int i=a-1;i>=b;i--)
#define MEM(a,x) memset(a,x,sizeof a)
#define ll __int64
using namespace std;
int n,m;
char map[210][210];
int vis[210][210];
int sx,sy,ex,ey;
int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
struct node
{
int x,y;
int step;
bool operator <(const node p)const
{
return step>p.step;
}
};
node p,q;
void bfs()
{
priority_queue<node> Q;
q.x=sx; q.y=sy;
q.step=0;
vis[q.x][q.y]=1;
Q.push(q);
bool flag=1;
while(!Q.empty())
{
q=Q.top(); Q.pop();
if(q.x==ex&&q.y==ey)
{
printf("%d\n",q.step);
return;
}
for(int i=0;i<4;i++)
{
p.x=q.x+dir[i][0]; p.y=q.y+dir[i][1];
if(p.x>=0&&p.x<n&&p.y>=0&&p.y<m&&!vis[p.x][p.y]&&map[p.x][p.y]!='#')
{
p.step=q.step+1;
vis[p.x][p.y]=1;
if(map[p.x][p.y]=='a')
{
printf("%d\n",p.step);
return;
}
if(map[p.x][p.y]=='x')
p.step++;
Q.push(p);
}
}
}
if(flag)
printf("Poor ANGEL has to stay in the prison all his life.\n");
}
int main()
{
//freopen("ceshi.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
for(int j=0;j<m;j++)
{
if(map[i][j]=='r')
{
sx=i; sy=j;
}
if(map[i][j]=='a')
{
ex=i; ey=j;
}
}
}
MEM(vis,0);
bfs();
}
return 0;
}