用C++写地下城小地图A星寻路
时间: 2024-03-12 09:48:01 浏览: 101
C、C++实现字母/英文句子大小写转换
好的,下面我给你提供一个用C++实现地下城小地图A星寻路的简单示例代码,供你参考:
```c++
#include <iostream>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f; // 表示无穷大
struct Node{
int x, y; // 节点坐标
int f, g, h; // f = g + h
bool operator < (const Node &A) const{
// 优先级队列需要重载小于号运算符
return f > A.f;
}
};
const int N = 10;
int n, m; // 地图大小
int sx, sy; // 起点坐标
int ex, ey; // 终点坐标
char g[N][N]; // 地图数组
bool vis[N][N]; // 标记数组,标记某个点是否被访问过
int d[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; // 方向数组
// 判断一个点是否可以走(不超出边界,不是墙,没有访问过)
bool check(int x, int y){
if(x < 0 || x >= n || y < 0 || y >= m) return false;
if(g[x][y] == '#') return false;
if(vis[x][y]) return false;
return true;
}
// 计算曼哈顿距离
int manhattan(int x, int y){
return abs(x - ex) + abs(y - ey);
}
// A星搜索
int A_star(){
priority_queue<Node> q;
memset(vis, false, sizeof(vis));
Node start = {sx, sy, 0, 0, manhattan(sx, sy)};
q.push(start);
while(!q.empty()){
Node t = q.top();
q.pop();
if(vis[t.x][t.y]) continue;
vis[t.x][t.y] = true;
if(t.x == ex && t.y == ey) return t.f;
for(int i = 0; i < 4; i++){
int nx = t.x + d[i][0], ny = t.y + d[i][1];
if(check(nx, ny)){
Node nxt = {nx, ny, 0, 0, 0};
nxt.g = t.g + 1;
nxt.h = manhattan(nx, ny);
nxt.f = nxt.g + nxt.h;
q.push(nxt);
}
}
}
return -1;
}
int main(){
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> g[i];
}
cin >> sx >> sy >> ex >> ey;
int ans = A_star();
cout << ans << endl;
return 0;
}
```
以上是一个简单的地下城小地图A星寻路的C++实现示例,希望对你有所帮助。
阅读全文