A*寻路算法

简介:

//http://poj.org/problem?id=2449

include

include

include

include

using namespace std;

typedef pair pii;//距离,顶点
struct Arc
{

int vex;
int weight;

};

const int MAX_VEX_NUM = 1010;
const int MAX = 1<<20;

vector Adjlist[MAX_VEX_NUM];
vector AdjlistRev[MAX_VEX_NUM];//反向图,求h(n)
int h[MAX_VEX_NUM];

int S,T,K;

void Init()
{

int N,M;
int A,B,T;
cin>>N>>M;
int i;
for(i = 0; i < N; i++)
{
    Adjlist[i].clear();
    AdjlistRev[i].clear();
}
Arc arc;
for(i = 0; i < M; i++)
{
    cin>>A>>B>>T;
    arc.vex = B;
    arc.weight = T;
    Adjlist[A].push_back(arc);
    arc.vex = A;
    AdjlistRev[B].push_back(arc);
}
cin>>S>>::T>>K;

}

//计算h[n]
void Dijkstra(int u)
{

priority_queue<pii, vector<pii>, greater<pii> > pq_dij;
bool traversed[MAX_VEX_NUM];
memset(traversed, false, MAX_VEX_NUM * sizeof(bool));
for(int i = 0; i < MAX_VEX_NUM; i++)
{
    h[i] = MAX;
}
 
h[u] = 0;
pq_dij.push(make_pair(h[u], u));
while(!pq_dij.empty())
{
    pii pq_node = pq_dij.top();
    pq_dij.pop();
    int v = pq_node.second;
    if(traversed[v])
        continue;
    traversed[v] = true;
    for(vector<Arc>::iterator iter = AdjlistRev[v].begin(); iter != AdjlistRev[v].end(); iter++)
    {
        int w = iter->vex;
        int weight = iter->weight;
        if(h[w] > h[v] + weight)
        {
            h[w] = h[v] + weight;
            pq_dij.push(make_pair(h[w], w));
        }
    }
}

}

int Astar(int s, int t, int k)
{

priority_queue<pii, vector<pii>, greater<pii> > pq_astar;
int cnt[MAX_VEX_NUM];
memset(cnt, 0, MAX_VEX_NUM * sizeof(int));
pq_astar.push(make_pair(h[s], s));
 
while(!pq_astar.empty())
{
    pii node = pq_astar.top();
    pq_astar.pop();
    int u = node.second;
    int cost = node.first;
    cnt[u]++;
    if(cnt[t] == k)
        return cost;
    if(cnt[u] > k)
        continue;
    for(vector<Arc>::iterator iter = Adjlist[u].begin(); iter != Adjlist[u].end(); iter++)
    {
        int v = iter->vex;
        int weight = iter->weight;
        if(h[v] != MAX)
        {
            pii adjArc = make_pair(cost - h[u] + weight + h[v], v);
            pq_astar.push(adjArc);
        }
    }
}
return -1;

}

int main()
{

//freopen("in.txt", "r", stdin);

Init();
Dijkstra(T);

if(S == T)
    K++;
cout<<Astar(S, T, K)<<endl;
return 0;

}

目录
相关文章
|
算法 定位技术
Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
748 0
Threejs中使用A*算法寻路导航,Threejs室内室外地图导航
|
5天前
|
算法 定位技术 图形学
unity3d寻路算法
unity3d寻路算法
|
算法
Threejs中使用astar(A*)算法寻路导航,Threejs寻路定位导航
Threejs中使用astar(A*)算法寻路导航,Threejs寻路定位导航
510 0
Threejs中使用astar(A*)算法寻路导航,Threejs寻路定位导航
|
11月前
|
算法 定位技术
“ 探索迷局:解密广度寻路算法 “(二)
“ 探索迷局:解密广度寻路算法 “
|
人工智能 算法 安全
游戏人工智能——A*寻路算法实践
A*寻路算法实践 一、题目背景 随着多媒体设备、虚拟现实、增强现实、物联网等技术的飞跃发展,计算速度与存储容量的日益提高以及相关软件的研究取得长足进步,人工智能的应用得以进一步推广发展起来。地图寻径问题是人工智能技术的一个重要领域。在网络游戏中,寻径问题必须考虑多方面的因素,比如游戏地图中文件结构和起点与目标点之间是否可以连通以及游戏运行时运行内存资源占用、可扩展更新性、安全程度等。长久以来,游戏开发者在开发过程中为了实现这些绞尽脑汁。 在搜索寻径问题中,Dijkstra算法是目前许多工程解决最短路径
294 0
游戏人工智能——A*寻路算法实践
|
算法 网络协议 定位技术
|
机器学习/深度学习 人工智能 算法
人工智能: 自动寻路算法实现(三、A*算法)
前言 本篇文章是机器人自动寻路算法实现的第三章。我们要讨论的是一个在一个M×N的格子的房间中,有若干格子里有灰尘,有若干格子里有障碍物,而我们的扫地机器人则是要在不经过障碍物格子的前提下清理掉房间内的灰尘。
1886 0
|
人工智能 算法 机器人
人工智能: 自动寻路算法实现(一、广度优先搜索)
前言 随着人工智能技术的日益发达,我们的生活中也出现了越来越多的智能产品。我们今天要关注的是智能家居中的一员:扫地机器人。
2346 0
|
存储 人工智能 算法
寻路算法:找到NPC最好的行走路径
寻路就是一个看似简单问题的解:给定点A 和B,AI 该怎么智能地在游戏世界中行走?这个问题的复杂来自于实际上A 和B 之间存在大量的路径可走,但只有一条是最佳的。只是找到一条两点之间的有效路径是不够的。理想的寻路算法需要查找所有可能的情况,然后比较出最好的路径。
5653 0