概要

  A*算法是一种启发式寻路算法,BFS是一种盲目的无目标的搜索算法,相比于BFS,A*算法根据适应度构建优先队列,根据适应度值可以很好的向目标点移动,具体详情,请看搜索相关文档,我在只是实现了在无障碍的情况下的A*算法,有障碍的情况类似。

开发环境

  visual studio 2017 + eaysX

实现

 #include<stdio.h>
#include<vector>
#include<queue>
#include<graphics.h>
#include<stdlib.h>
#include<time.h>
#include<unordered_set> using namespace std; const int WIDTH_BLOCK_NUM = ;
const int HEIGHT_BLOCK_NUM = ;
const int WINDOWS_WIDTH = ;
const int WINDOWS_HEIGHT = ;
const int MAX_MARK = ;
const int MIN_MARK = ; int dir_x[] = { ,,,,,-,-,- };
int dir_y[] = { ,-,,,-,,-, }; struct Block
{
public:
int x, y;
int f;
int g;
Block(int x, int y, int f, int g)
{
this->x = x;
this->y = y;
this->f = f;
this->g = g;
}
Block() {}
friend bool operator<(Block a, Block b) {
return a.f + a.g > b.f + b.g;
}
};
priority_queue<Block>pq;
vector<Block>vec;
vector<Block>local_vec;
unordered_set<int>us;
Block start_block, end_block; int randInt(int left, int right);
void init();
void draw();
void position2rectangle(struct Block&b, int rect[][]);
bool is_valid(int x, int y);
int position2mark(int x, int y); int main()
{
srand(time(NULL));
init();
initgraph(WINDOWS_WIDTH, WINDOWS_HEIGHT);
Block temp = start_block;
pq.push(temp);
us.insert(position2mark(temp.x, temp.y)); while (!(temp.x == end_block.x&&temp.y == end_block.y))
{
temp = pq.top();
pq.pop();
vec.push_back(temp);
for (int i = ; i < ; ++i) {
int temp_x = temp.x + dir_x[i];
int temp_y = temp.y + dir_y[i];
if (is_valid(temp_x, temp_y) && !us.count(position2mark(temp_x, temp_y))) {
Block b;
b.x = temp_x;
b.y = temp_y;
b.f = temp.f + (abs(dir_x[i]) + abs(dir_y[i])) > ? : ;
b.g = (abs(temp_x - end_block.x) + abs(temp_y - end_block.y)) * ;
pq.push(b);
us.insert(position2mark(temp_x, temp_y));
local_vec.push_back(b);
}
}
draw();
}
closegraph();
return ;
} int randInt(int left, int right)
{
return rand() % (right - left + ) + left;
} void init()
{
start_block.x = randInt(MIN_MARK, MAX_MARK);
start_block.y = randInt(MIN_MARK, MAX_MARK);
end_block.x = randInt(MIN_MARK, MAX_MARK);
end_block.y = randInt(MIN_MARK, MAX_MARK);
while (start_block.x==end_block.x||start_block.y==end_block.y)
{
end_block.x = randInt(MIN_MARK, MAX_MARK);
end_block.y = randInt(MIN_MARK, MAX_MARK);
}
} void draw()
{
int width = WINDOWS_WIDTH / WIDTH_BLOCK_NUM;
int height = WINDOWS_HEIGHT / HEIGHT_BLOCK_NUM;
for (int i = ; i < WINDOWS_WIDTH; i += width)
{
line(i, , i, WINDOWS_HEIGHT);
} for (int i = ; i < WINDOWS_HEIGHT; i += height)
{
line(, i, WINDOWS_WIDTH, i);
}
int arr[][];
COLORREF prev_color = getfillcolor(); setfillcolor(BLUE);
for (Block b : local_vec)
{
position2rectangle(b, arr);
fillrectangle(arr[][], arr[][], arr[][], arr[][]);
} setfillcolor(RED);
for (Block b : vec)
{
position2rectangle(b, arr);
fillrectangle(arr[][], arr[][], arr[][], arr[][]);
} setfillcolor(GREEN);
position2rectangle(start_block, arr);
fillrectangle(arr[][], arr[][], arr[][], arr[][]);
position2rectangle(end_block, arr);
fillrectangle(arr[][], arr[][], arr[][], arr[][]); setfillcolor(prev_color);
Sleep();
} void position2rectangle(struct Block&b, int rect[][])
{
int width = WINDOWS_WIDTH / WIDTH_BLOCK_NUM;
int height = WINDOWS_HEIGHT / HEIGHT_BLOCK_NUM;
int temp_x = b.x*width;
int temp_y = b.y*height;
rect[][] = temp_x;
rect[][] = temp_y;
rect[][] = temp_x + width;
rect[][] = temp_y + height;
} bool is_valid(int x, int y)
{
if (x < || y < || x >= WIDTH_BLOCK_NUM || y >= HEIGHT_BLOCK_NUM) {
return false;
}
return true;
} int position2mark(int x, int y)
{
return x + y * WIDTH_BLOCK_NUM;
}

运行展示

A*算法实现(图形化表示)——C++描述的更多相关文章

  1. Python排序算法动态图形化演示(实现代码)

     1.冒泡排序 冒泡排序是最简单也是最容易理解的排序方法,其原理就是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...

  2. 图形化查看maven的dependency依赖

    开发项目的时候,我们想知道一个maven的依赖库是来自那个工程,eclipse有插件可以直接看Dependency Hierarchy,推荐一个第三方的工具yED 在工程的pom.xml文件中添加如下 ...

  3. Linux配置VNC实现远程图形化操纵

    问题描述 有些时候需要用到图形化,其实可以通过其他途径实现.但是懒惰的就喜欢VNC,总的老说都是需要图形组件的 问题解决 在Centos测试 一.图形化的Linux 01.安装 rpm  ivh vn ...

  4. Atitit.工作流系统的本质是dsl 图形化的dsl  4gl

    Atitit.工作流系统的本质是dsl 图形化的dsl  4gl 1. 工作流系统的本质是dsl 图形化的dsl  4gl1 2. 为什么每个项目系统都需要工作流1 3. 工作流dsl与java .n ...

  5. [未完成]关于GUI Java图形化界

    "笔记内容完成,整体未完成" GUI 图形化用户界面 用java做图形化用户界面的程序不多,大多用C++和defy.因为,Java做图形化效率低. 首先你要安装一个虚拟机,C++是 ...

  6. 转:二十七、Java图形化界面设计——容器(JFrame)

    转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...

  7. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...

  8. Java图形化界面设计——容器(JFrame)

    Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...

  9. 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用

    在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...

  10. 终于等到你: 图形化开源爬虫Hawk 3发布!

    超级图形化爬虫Hawk已经发布两年半时间了,2015年升级到第二版,收到上千条用户反馈(tucao),100多个红包,总共666块五毛~一直想攒着这笔钱,去北境之王天通苑的龙德商场买最心爱的阿迪王! ...

随机推荐

  1. hibernate之inverse=true相关配置讲解

      首先inverse=”true”是在双向关联里面使用单向关联没有这个配置 inverse – 标记由哪一方来维护关联关系(双向关联中会用到) inverse默认值为false 如果inverse设 ...

  2. go中的数据结构-字典map

    1. map的使用 golang中的map是一种数据类型,将键与值绑定到一起,底层是用哈希表实现的,可以快速的通过键找到对应的值. 类型表示:map[keyType][valueType] key一定 ...

  3. Jmeter使用CSV Data参数化,中文参数传递过程出现乱码问题

    解决方式:文件编码改为GB2312.GBK.GB18030(utf-8同样会乱码)

  4. C# Job System概述

    C# 作业系统是如何工作 允许用户编写与Unity其余部分良好交互的多线程代码,并使编写正确的代码变得更加容易. 编写多线程代码可以提供高性能的好处,其中包括帧速率的显著提高.以及将Burst编译器与 ...

  5. numpy.take()

    numpy.take numpy的.take (a,indices,axis = None,out = None,mode ='raise' ) 沿轴取数组中的元素. 这个函数与“花式”索引(使用数组 ...

  6. Linux 磁盘卷扩容

    首先识别磁盘,成功之后会显示在/dev下 [root@oracle01 ~]# fdisk /dev/sda ## /dev/sda为通过fdisk -l 查看到的物理磁盘(第一行) Welcome ...

  7. CDH安装前系统优化准备

    参考: https://www.cnblogs.com/yinzhengjie/p/10367447.html https://www.sysit.cn/blog/post/sysit/CDH6.2. ...

  8. 结合docker做flask+kafka数据接口与压力测试

    一.需求 需要做实时数据接入的接口.数据最终要写入库,要做到高并发,数据的完整,不丢失数据. 二.技术选型 1.因为只是做简单的接口,不需要复杂功能,所以决定用flask这个简单的python框架(因 ...

  9. 2019年8月23日 星期五(workerman和swoole的区别)

    两个框架我都有用过,workerman用得更多些,这2个框架都很出名,它们的出现大大的提高了php的应用范围及知名度 workerman和swoole都是php socket 服务器框架,都支持长连接 ...

  10. Java回调实现异步

    在正常的业务中使用同步线程,如果服务器每处理一个请求,就创建一个线程的话,会对服务器的资源造成浪费.因为这些线程可能会浪费时间在等待网络传输,等待数据库连接等其他事情上,真正处理业务逻辑的时间很短很短 ...