佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间? 输入 输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10 后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。 输出 输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。 样例输入 样例输入1 4 4 1 #@## **## ###+ **** 样例输入2 4 4 2 #@## **## ###+ **** 样例输出 样例输出1 6 样例输出2 4 给出C++解决代码
时间: 2024-04-07 12:29:27 浏览: 35
以下是用C++实现的代码:
```
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 205;
const int INF = 0x3f3f3f3f;
char map[MAXN][MAXN];
int dis[MAXN][MAXN][15];
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
struct Node {
int x, y, chakra;
};
int bfs(int sx, int sy, int ex, int ey, int t) {
memset(dis, INF, sizeof(dis));
queue<Node> q;
q.push({sx, sy, t});
dis[sx][sy][t] = 0;
while (!q.empty()) {
Node now = q.front();
q.pop();
if (now.x == ex && now.y == ey) {
return dis[now.x][now.y][now.chakra];
}
if (map[now.x][now.y] == '#') {
continue;
}
for (int i = 0; i < 4; i++) {
int nx = now.x + dx[i];
int ny = now.y + dy[i];
if (nx < 0 || nx >= MAXN || ny < 0 || ny >= MAXN) {
continue;
}
if (map[nx][ny] == '#') {
continue;
}
if (map[nx][ny] == '+' && now.chakra == 0) {
continue;
}
int nxt_chakra = now.chakra;
if (map[nx][ny] == '+') {
nxt_chakra--;
}
if (dis[nx][ny][nxt_chakra] > dis[now.x][now.y][now.chakra] + 1) {
dis[nx][ny][nxt_chakra] = dis[now.x][now.y][now.chakra] + 1;
q.push({nx, ny, nxt_chakra});
}
}
}
return -1;
}
int main() {
int m, n, t;
cin >> m >> n >> t;
int sx, sy, ex, ey;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> map[i][j];
if (map[i][j] == '@') {
sx = i;
sy = j;
}
if (map[i][j] == '+') {
ex = i;
ey = j;
}
}
}
cout << bfs(sx, sy, ex, ey, t) << endl;
return 0;
}
```
思路解析:
题目要求求出鸣人跟佐助之间的最短时间,因此可以使用 BFS 求解。
首先读入地图和鸣人的初始查克拉数量 T,然后使用 BFS 从鸣人的初始位置开始搜索。在 BFS 的过程中,需要记录鸣人到每个点所需的最短时间,以及鸣人在到达该点时所剩下的查克拉数量。如果鸣人到某个点时查克拉数量为 0,那么就不能继续前进到有大蛇丸手下的位置了。
当鸣人到达佐助的位置时,就可以得到鸣人追上佐助所需要的最短时间。
需要注意的是,题目中给出的地图大小为 M×N,其中 M 和 N 都可能达到 200,因此需要开较大的数组来存储最短时间和鸣人的查克拉数量。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![cpp](https://img-home.csdnimg.cn/images/20210720083646.png)