智能驾驶-C++(D)
发布时间
阅读量:
阅读量
示例1
示例2
解题思路: 本题可以看作是一种有负权边的最短路,使用SPAF算法即可。
c++解法:
#include<bits/stdc++.h>
#define int long long
using namespace std;
// 用于读取一行输入并将其分割成整数向量
vector<int> line2vec() {
string line;
getline(cin, line);
istringstream iss(line);
vector<int> res;
string token;
while (getline(iss, token, ',')) // 通过逗号分隔读取数字
res.push_back(stoi(token)); // 将读取的字符串转换为整数
return res;
}
int n, m; // n, m 分别为网格的行数和列数
int dx[] = {1, 0, -1, 0}; // 表示移动方向,分别为下、右、上、左(x 方向移动)
int dy[] = {0, 1, 0, -1}; // 表示移动方向,分别为下、右、上、左(y 方向移动)
vector<vector<int>> mp; // 存储网格信息
vector<vector<bool>> vis; // 访问标记数组
vector<vector<int>> dis; // 存储从终点到各点的最短距离
// 主函数
signed main() {
vector<int> v = line2vec(); // 读取网格尺寸
n = v[0]; // 行数
m = v[1]; // 列数
for (int i = 0; i < n; i++) {
mp.push_back(line2vec()); // 读取每行的网格信息
vis.push_back(vector<bool>(m, 0)); // 初始化访问标记数组
dis.push_back(vector<int>(m, 1e9)); // 初始化最短距离数组,用非常大的数表示
}
// 初始化终点的距离为终点本身的耗油量
dis[n-1][m-1] = mp[n-1][m-1]; // 终点的耗油量为其自身值
vis[n-1][m-1] = 1; // 标记终点已访问
queue<pair<int,int>> q; // 使用队列进行BFS
q.push({n-1, m-1}); // 从终点开始遍历
// BFS 过程
while (q.size()) {
auto [x, y] = q.front();
q.pop();
vis[x][y] = 0;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i]; // 计算下一个位置的坐标
int ny = y + dy[i];
// 如果下一个位置超出边界或者是障碍物则跳过
if (nx < 0 || nx >= n || ny < 0 || ny >= m)
continue;
if (mp[nx][ny] == 0) // 障碍物不可走
continue;
int nxtval = 0;
if (mp[nx][ny] > 0) // 如果当前位置为耗油量
nxtval = dis[x][y] + mp[nx][ny];
if (nxtval > 100) // 超过油箱容量的不考虑
continue;
if (dis[nx][ny] > nxtval) { // 如果找到更短的路径则更新
dis[nx][ny] = nxtval;
if (!vis[nx][ny]) {
vis[nx][ny] = 1;
q.push({nx, ny});
}
}
}
}
int ans = -1;
if (dis[0][0] <= 100) // 如果起点的最短路径油量不超过100
ans = dis[0][0];
cout << ans << endl;
return 0;
}
AI助手

全部评论 (0)
还没有任何评论哟~
