救ANGEL出监狱BFS

来源:互联网 发布:linux下perl开发工具 编辑:程序博客网 时间:2024/05/17 03:18
a表示angel位置,r代表营救方,x代表警卫,#代表墙,.代表无障碍,营救方前进花1s,杀死警卫1s,求救angel花费的最少时间

思路:BSF队列中存储结点为结构体,包含当前位置,步数,时间,只有当到达该位置的时间比已到该位置其他路径花费的时间少时入队,由二维数组存储到达某个位置的最少时间
#include <iostream>
#include <stdlib.h>
#include <queue>
#define MAX 200
#define INF 1000000
using namespace std;
 
typedef struct point{
int x, y;
int step;
int time;
};
 
int dirs[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
int N,M;
char maps[MAX][MAX];
queue<point> q;
int mintime[MAX][MAX];
int ax,ay;
 
int BFS(point s){
q.push(s);
point hd;
while(!q.empty()){
hd = q.front();
q.pop();
for(int i=0; i<4; i++){
int x = hd.x + dirs[i][0];
int y = hd.y + dirs[i][1];
if(x>=0&&x<=N-1 && y>=0 && y<= N-1 && maps[x][y]!='#'){
point t;
t.x = x;
t.y = y;
t.step = hd.step + 1;
t.time = hd.time + 1;
if(maps[x][y]=='x'){
t.time += 1;
}
if(t.time < mintime[x][y]){
mintime[x][y] = t.time;
q.push(t);
}
}
}
}
return mintime[ax][ay];
}
 
/**
7 8
#.#####.
#a.#xr..
#.x#xx..
..xxxx.#
#.......
.#......
........
**/
 
int main()
{
point r;
int mintimes;
cin>>N>>M;
for(int i=0; i<N; i++){
for(int j=0; j<M;j++){
cin>>maps[i][j];
mintime[i][j] = INF;
if(maps[i][j]=='a'){
ax = i;
ay = j;
}else if(maps[i][j]=='r'){
r.step = 0;
r.time = 0;
r.x = i;
r.y = j;
mintime[i][j] = 0;
}
}
}
 
mintimes = BFS(r);
if(mintimes < INF){
cout<<mintimes<<endl;
}else{
cout<<"Poor ANGEL has to stay in the prison all his life."<<endl;
}
 
return 0;
}
12
0 0