BFS和Dijkstra结合
Description
数据结构与算法实验题 Sins of a Solar EmpireP6
★实验任务
正如你所知道的s_sin是一个贪玩的不得了的小P孩QAQ,你也知道他最近很喜欢玩一个叫做太阳帝国的原罪的策略游戏去年
他已经和疯狂的AI交战了整整一年。而现在,战斗的序幕又要拉开了。
在某个星球上,该星球由n*m个方格组成,每个方格中可能为boss,s_sin,障碍,道路,小怪。s_sin想要去打爆boss,假
设他可以秒杀boss,现在他的任务只需要到达boss所在的位置。如果s_sin想要到达某个方格,但方格中有小怪,那么必须
打死小怪,才能到达这个方格。假设s_sin只能向上、下、左、右移动一个格子,移动一步用时1个时间单位,杀死小怪也用
1个时间单位。假设s_sin很强壮,可以杀死所有小怪。
试计算s_sin到达boss位置至少需要多少时间。注意:障碍是不能通过的。
Input
★数据输入
输入第一行为两个正整数n,m (1 < =n,m< =100), 表示该地图有n行m列。
接下来n行,每行m个字符:“.”代表道路 , “a”代表boss , “r”代表s_sin ,“#”代表障碍,“x”代表小怪。
Output
★数据输出
如果s_sin能到达boss位置则输出所需的最少时间。如果无法达到,则输出-1
Sample Input
5 5
.....
.....
axxxr
.....
.....
Sample Output
6
Sample Input
7 8
.#####.
.a#..rx
..#x.x.
..#..#.#
...##..
.#......
........
Sample Output
13
思路
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#define M 0x3f3f3f
using namespace std;
typedef pair<int, int>PII;
const int N = 110;
int n, m;
int a, b;//起点
int c, d;//终点
char map[N][N];
int dist[N][N];
int dx[4] = { -1,1,0,0 };
int dy[4] = { 0,0,-1,1 };
void bfs(int x, int y)
{
queue<PII>q;
q.push({ x,y });
dist[x][y] = 0;
map[x][y] = '#';
while (q.size())
{
auto u = q.front();
q.pop();
if (map[u.first][u.second] == 'a')
{
c = u.first, d = u.second;
//return;
}
for (int i = 0; i < 4; i++)
{
int nx = u.first + dx[i]; int ny = u.second + dy[i];
if (nx < 0 || nx >= n || ny < 0 || ny >= m)continue;
if (map[nx][ny] == '#' )continue;
int cmp = dist[u.first][u.second];
if (map[nx][ny] == 'x')
{
if (dist[nx][ny] > cmp + 2) {
dist[nx][ny] = cmp + 2;
q.push({ nx,ny });
}
}
else
{
if (dist[nx][ny] > cmp + 1) {
dist[nx][ny] = cmp + 1;
q.push({ nx,ny });
}
}
}
}
}
int main() {
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> map[i][j];
if (map[i][j] == 'r')
{
a = i, b = j;
}
dist[i][j] = M;
}
}
bfs(a, b);
if (dist[c][d] == -1)cout << -1 << endl;
else cout << dist[c][d] << endl;
}
/*
7 8
#.#####.
#.a#..rx
#..#x.x.
..#..#.#
#...##..
.#......
........
*/