数据结构与算法实验题 10.31 Sins of a Solar Empire P6
实验任务
正如你所知道的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位置至少需要多少时间。注意:障碍是不能通过的。
数据输入
输入第一行为两个正整数n,m (1 < =n,m< =100), 表示该地图有n行m列。
接下来n行,每行m个字符:“.”代表道路 , “a”代表boss , “r”代表s_sin ,“#”代表障碍,“x”代表小怪。
数据输出
如果s_sin能到达boss位置则输出所需的最少时间。如果无法达到,则输出-1
输入示例1
6 8
#.#####.
#.a##..r
..xxx#x.
..#xx#.#
#...##..
.#......
输出示例1
16
输入示例2
6 8
#.#####.
#.a##..r
.##..#x.
..#..#.#
#...##..
.#......
输出示例2
-1
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=2e9+1;
int T=1,n,m,dis[110][110],ans=inf,vis;
int movx[]={1,-1,0,0};
int movy[]={0,0,1,-1};
string a[110];
queue<pair<int,int>>que;
int main()
{
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=0;i<n;i++) {
cin>>a[i];
for(int j=0;j<m;j++) {
dis[i][j]=inf;
if(a[i][j]=='r') {
que.push({i,j});
dis[i][j]=0;
}
}
}
while(!que.empty()) {
int x=que.front().first;
int y=que.front().second;
que.pop();
for(int i=0;i<4;i++) {
int nx=x+movx[i];
int ny=y+movy[i];
if(nx<0||nx>=n||ny<0||ny>=m) continue;
if(dis[nx][ny]>dis[x][y]+1&&a[nx][ny]=='.') {
que.push({nx,ny});
dis[nx][ny]=dis[x][y]+1;
}
if(dis[nx][ny]>dis[x][y]+2&&a[nx][ny]=='x') {
que.push({nx,ny});
dis[nx][ny]=dis[x][y]+2;
}
if(a[nx][ny]=='a') ans=min(ans,dis[x][y]+1),vis=1;
}
}
if(!vis) cout<<-1;
else cout<<ans;
return 0;
}
思路
没什么好说的,经典迷宫BFS,不太相同的点在于,遇到x的时候dis需要+2,其它没有什么特别的了
迷宫BFS例题:洛谷B3625 迷宫寻路
BFS相关算法详解:OI Wiki - BFS