作者:跑不快的码 | 来源:互联网 | 2024-11-18 16:02
题目描述:计算从起点到终点的最小能量消耗。如果下一个单元格的风向与当前单元格相同,则消耗为0,否则为1。共有8个可能的方向。
解题思路:在广度优先搜索(BFS)的基础上,使用优先队列来获取最小的能量消耗值。
代码实现:
#include
#include
#include
#include
#include
using namespace std;
const int MAXN = 1010;
const int INF = 0x3f3f3f3f;
struct node {
int x, y, c;
bool operator <(const node &a) const {
return c > a.c;
}
} tmp;
int n, m, sx, sy, ex, ey;
char map[MAXN][MAXN];
int f[MAXN][MAXN];
int dir[8][2] = {{-1, 0}, {-1, 1}, {0, 1}, {1, 1}, {1, 0}, {1, -1}, {0, -1}, {-1, -1}};
void bfs() {
priority_queue q;
node a = {sx, sy, 0};
q.push(a);
while (!q.empty()) {
tmp = q.top();
q.pop();
int tx = tmp.x, ty = tmp.y;
if (tx == ex && ty == ey)
return;
int cost;
for (int i = 0; i <8; i++) {
tx = tmp.x + dir[i][0];
ty = tmp.y + dir[i][1];
if (tx >= 0 && tx = 0 && ty cost) {
f[tx][ty] = cost;
q.push(cur);
}
}
}
}
}
int main() {
while (scanf("%d%d", &n, &m) != EOF) {
for (int i = 0; i
通过上述代码,我们能够有效地计算从起点到终点的最小能量消耗,同时利用优先队列确保每次选择的能量消耗最小的路径进行扩展。