概要

  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. yum安装etcd集群

       前一篇文章介绍了如何yum安装简单的kubernetes集群,其中etcd是单点部署.本篇我们来搭建etcd集群,方便日后搭建kubernetes HA集群架构. 1,环境配置说明 etcd1 ...

  2. JQuery II

    jQuery事件的绑定 <body> <button>点击1</button> <button>点击2</button> </body ...

  3. 【POJ - 3126】Prime Path(bfs)

    Prime Path 原文是English 这里直接上中文了 Descriptions: 给你两个四位的素数a,b.a可以改变某一位上的数字变成c,但只有当c也是四位的素数时才能进行这种改变.请你计算 ...

  4. 【DSP开发】TI第二代KeyStone SoC诠释德仪的“云”态度

    11月14日,期盼已久的德州仪器基于ARM Cortex-A15的产品终于新鲜出炉.伴随着TIKeyStone II多核 SoC系列产品的发布,结合了ARM Cortex-A15 处理器.C66x D ...

  5. Macaca环境搭建(一)----windows系统macaca安装

    一.安装JDK, 1.官方网站:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  6. 四则运算计算器的微信小程序_2 运算

    js文件: function isOperator(value) {   var operatorString = '+-*/()×÷';   return operatorString.indexO ...

  7. [LGP2000] 拯救世界

    6的倍数 1/(1-x^6) 最多9块 (1-x^10)/(1-x) 最多5块 (1-x^6)/(1-x) 4的倍数 1/(1-x^4) 最多7块 (1-x^8)/(1-x) 2的倍数 1/(1-x^ ...

  8. [NAIPC2016]Jewel Thief(决策单调性+分治)

    [NAIPC2016]Jewel Thief(决策单调性+分治) 题面 原题提交地址(题目编号H) 原题面下载地址 有\(n\)个物品,每个物品有一个体积\(w_i\)和价值\(v_i\),现在要求对 ...

  9. FFmpeg4.0笔记:VS2019编译FFmpeg4.0源码

    0.下载TDM.msys和yasm 1.安装TDM-GCC-64 2.安装msys到TDM-GCC的安装目录中 3.将call "C:\Program Files (x86)\Microso ...

  10. AppCan全局搜索

    Ctrl + H,在项目中全局搜索英文和中文