概要

  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. 使用robotframework做接口测试三——保持登录状态

    调用登录接口登录了,其他的接口怎么保持登录状态呢?  首先来看一看,web端或者说客户端是怎么样用cookie/token等保持登录状态的.一般来说,cookie都会在登录接口由服务端返回,而且会是在 ...

  2. CTF—攻防练习之HTTP—SQL注入(SSI注入)

    主机:192.168.32.152 靶机:192.168.32.161 ssI是赋予html静态页面的动态效果,通过ssi执行命令,返回对应的结果,若在网站目录中发现了.stm .shtm .shtm ...

  3. Java ——类型转换 向args传递参数

    本节重点思维导图  自动类型转换 整型.实型(常量).字符型数据可以混合运算 运算中,不同类型的数据先转化为同一类型,然后进行运算 转换从低级到高级 低 ----------------------- ...

  4. Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock)

    Leetcode之广度优先搜索(BFS)专题-752. 打开转盘锁(Open the Lock) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

  5. python基础之数据类型转换

    方法转换:str -->list str.split() list -->str ''.join(list)强制转换:str -->list list(str) str --> ...

  6. 什么是java的线程安全?同步,异步

    线程是比进程更小的执行单位,是在进程基础上进行的进一步划分.所谓多线程是指进程在执行过程中可以产生多个同时存在.同时运行的线程.多进程机制可以合理利用资源,提高程序的运行效率.一个进程至少包含一个线程 ...

  7. 【python基础学习】---解析多层json,解析xml

    1.以豆瓣的API接口为例子,解析返回的json数据 https://api.douban.com/v2/book/1220502 { "rating":{ "max&q ...

  8. 8.X版本的node打包时,gulp命令报错 require.extensions.hasownproperty

    版本不兼容的问题,低版本的gulp只能在低版本的node上执行. 修改一下node-modules/require-dir/index.js的97行代码即可,如下:

  9. Java小技巧:怎么循环日期?

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");try{//起始日期Date start = sdf.parse ...

  10. 2019牛客暑期多校训练营(第一场)-E(DP)

    题目链接:https://ac.nowcoder.com/acm/contest/881/E 题意:求可分解成n个AB和m个BA的字符串的个数. 思路: 首先根据贪心思想,前n个A可作为AB的A,后m ...