A*算法实现(图形化表示)——C++描述
概要
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++描述的更多相关文章
- Python排序算法动态图形化演示(实现代码)
1.冒泡排序 冒泡排序是最简单也是最容易理解的排序方法,其原理就是重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是 ...
- 图形化查看maven的dependency依赖
开发项目的时候,我们想知道一个maven的依赖库是来自那个工程,eclipse有插件可以直接看Dependency Hierarchy,推荐一个第三方的工具yED 在工程的pom.xml文件中添加如下 ...
- Linux配置VNC实现远程图形化操纵
问题描述 有些时候需要用到图形化,其实可以通过其他途径实现.但是懒惰的就喜欢VNC,总的老说都是需要图形组件的 问题解决 在Centos测试 一.图形化的Linux 01.安装 rpm ivh vn ...
- Atitit.工作流系统的本质是dsl 图形化的dsl 4gl
Atitit.工作流系统的本质是dsl 图形化的dsl 4gl 1. 工作流系统的本质是dsl 图形化的dsl 4gl1 2. 为什么每个项目系统都需要工作流1 3. 工作流dsl与java .n ...
- [未完成]关于GUI Java图形化界
"笔记内容完成,整体未完成" GUI 图形化用户界面 用java做图形化用户界面的程序不多,大多用C++和defy.因为,Java做图形化效率低. 首先你要安装一个虚拟机,C++是 ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
- 二十七、Java图形化界面设计——容器(JFrame)
摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...
- Java图形化界面设计——容器(JFrame)
Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的,因此实现图形化界面的程序编写是所有编程语言发展的必然趋势,在命令提示符下运行的程序可以让我们了解java程序的基本知识体系结构 ...
- 基于MATLAB2016b图形化设计自动生成Verilog语言的积分模块及其应用
在电力电子变流器设备中,常常需要计算发电量,由于电力电子变流器设备一般是高频变流设备,所以发电量的计算几乎时实时功率的积分,此时就会用到一个积分模块.发电量计算的公式如下:Q=∫P. FPGA由于其并 ...
- 终于等到你: 图形化开源爬虫Hawk 3发布!
超级图形化爬虫Hawk已经发布两年半时间了,2015年升级到第二版,收到上千条用户反馈(tucao),100多个红包,总共666块五毛~一直想攒着这笔钱,去北境之王天通苑的龙德商场买最心爱的阿迪王! ...
随机推荐
- Can not find connection pool config file
暂时未解决 checkActivation=====================true Can Not Parse ConnectionCfg! 2019/10/12-11:23:38 > ...
- Object.assign()的用法 -- 用于将所有可枚举属性的值从一个或多个源对象复制到目标对象,返回目标对象
语法: Object.assign(target, …sources) target: 目标对象,sources: 源对象用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. ...
- Botanical Dimensions:借助第九代智能英特尔® 酷睿™ 处理器实现独特沉浸式体验
本文介绍位于洛杉矶的互动体验设计工作室 Master of Shapes (MOS) 打造 Botanical Dimensions 时所做出的技术努力.在这种互动式多世界体验中,参与者将穿越丛林,寻 ...
- IIS写权限漏洞和XFF刷票原理
IIS写权限漏洞 PUT写入漏洞 此漏洞主要是因为服务器开启了webdav的组件导致的 1.扫描漏洞,yes,可以PUT: 2.用老兵的工具上传一句话文件test.txt,然后move改名为shell ...
- 吉首大学2019年程序设计竞赛-F 天花乱坠
题目链接:https://ac.nowcoder.com/acm/contest/992/F 题意:给定正n边形,边长为100,以每条边的中点连线构成新的正n边形,无限循环下去,求所有边的长度和. 思 ...
- GrapeCity Documents for Excel 文档API组件 V2.2 新特性介绍
GrapeCity Documents for Excel 文档API组件 V2.2 正式发布,本次新版本包含诸多重量级产品功能,如:将带有形状的电子表格导出为 PDF.控制分页和电子表格内容.将Ex ...
- 洛谷 P3384树链剖分 题解
题面 挺好的一道树剖模板: 首先要学会最模板的树剖: 然后这道题要注意几个细节: 初始化时,seg[0]=1,seg[root]=1,top[root]=root,rev[1]=root; 在线段树上 ...
- Intellij IDEA 配置 Code Style
前言 昨天自说自话,闲扯了界面设计和代码规范.设计确实需要一些经验,也不一定能取悦所有人.而代码规范却是程序员所起码应当做到的,多人协作中,杂乱的代码就好像批阅潦草的作文,可读性极差. 然而这是个懒人 ...
- js 禁用F12 和右键查看源码
<script> window.onkeydown = function(e) { if (e.keyCode === 123) { e.preventDefault() } } wind ...
- golang利用beego框架orm操作mysql
GO引入orm框架操作mysql 在beego框架中引入orm操作mysql需要进行的步骤: 第一步:导入orm框架依赖,导入mysql数据库的驱动依赖 import ( "github.c ...