救援行动(save)
题目描述
Angel被人抓住关在一个迷宫了!迷宫的长、宽均不超过200,迷宫中有不可以越过的墙以及*的看守。Angel的朋友带了一个救援队来到了迷宫中。他们的任务是:接近Angel。我们假设接近Angel就是到达Angel所在的位置。
假设移动需要1单位时间,杀死一个看守也需要1单位时间。到达一个格子以后,如果该格子有看守,则一定要杀死。交给你的任务是,最少要多少单位时间,才能到达Angel所在的地方(只能向上、下、左、右4个方向移动)?
输入
第1行两个整数n,m。表示迷宫的大小为n×m。
以后n行,每行m个字符。其中“#”代表墙,“.”表示可以移动,“x”表示看守,“a”表示Angel,“r”表示救援队伍。字母均为小写。
输出
l行,代表救出Angel的最短时间。如果救援小组永远不能达到Angel处,则输出“NO ANSWER”。
样例输入
7 8
#.#####.
#.a#..r.
#..#x...
..#..#.#
#...##..
.#......
........
样例输出
13
分析:bfs,先走当前拜访时间小的;
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include <queue>
#define ll long long
#define rep(i,m,n) for(i=m;i<=n;i++)
#define inf 0x3f3f3f3f
const int maxn=2e2+;
using namespace std;
int n,m,vis[maxn][maxn];
const int dis[][]={,,,,-,,,-};
char a[maxn][maxn];
bool flag;
void dfs(int x,int y)
{
priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >, greater<pair<int,pair<int,int> > > >p;
vis[x][y]=;p.push(make_pair(,make_pair(x,y)));
while(!p.empty())
{
pair<int,pair<int,int> > b=p.top();p.pop();
for(int i=;i<;i++)
{
int l=b.second.first+dis[i][],r=b.second.second+dis[i][];
if(l>=&&l<n&&r>=&&r<m&&!vis[l][r]&&a[l][r]!='#')
{
vis[l][r]=vis[b.second.first][b.second.second]++(a[l][r]=='x');
p.push(make_pair(vis[l][r],make_pair(l,r)));
if(a[l][r]=='a')return;
}
}
}
}
int main()
{
int i,j,k,t;
scanf("%d%d",&n,&m);
rep(i,,n-)scanf("%s",a[i]);
rep(i,,n-)rep(j,,m-)
{
if(a[i][j]=='r'){dfs(i,j);break;}
}
rep(i,,n-)rep(j,,m-)if(a[i][j]=='a')goto loop;
loop:;
if(vis[i][j]!=)printf("%d\n",vis[i][j]-);
else puts("NO ANSWER");
//system("pause");
return ;
}