概要

  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. 04 npm 命令大全

    一.npm简介   npm(Node Package Manager)是随同node.js 一起安装的包管理工具,为了解决nodejs代码部署上的很多问题,常用以下场景: 允许用户从npm服务器下载别 ...

  2. sshpass密码

    使用sshpass sshpass -p "password" scp -r user@example.com:/some/remote/path /some/local/path ...

  3. 差分+贪心:IncDec序列

    原题 题目描述给定一个长度为 n 的数列 a1,a2,…,ana1,a2,…,an,每次可以选择一个区间 [l,r][l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列 ...

  4. Leetcode之动态规划(DP)专题-931. 下降路径最小和(Minimum Falling Path Sum)

    Leetcode之动态规划(DP)专题-931. 下降路径最小和(Minimum Falling Path Sum) 给定一个方形整数数组 A,我们想要得到通过 A 的下降路径的最小和. 下降路径可以 ...

  5. 非常好的一个JS代码(CJL.0.1.js)

    /*! * Cloudgamer JavaScript Library v0.1 * Copyright (c) 2009 cloudgamer * Blog: http://cloudgamer.c ...

  6. sass安装:webpack sass编译失败,node-sass安装失败的终极解决方

    文章来源:sass安装:webpack sass编译失败,node-sass安装失败的终极解决方 sass难言之隐-sass安装的坑 之前花了很多时间折腾node-sass,发现sass老是安装不上 ...

  7. div随着屏幕滚动而滚动

    <script type="text/javascript"> $(document).ready(function () { var menuYloc = $(&qu ...

  8. 检测Python程序本身是否已经在运行

    为runner.py实现一个函数,检测是否有其他的runner.py进程在正在执行? 除主要用到os模块,还用到了第三方模块psutil

  9. python 写接口供外部调用

    .py: import requests import urllib2 import commands import subprocess def check(): status, msg = com ...

  10. P3488 [POI2009]LYZ-Ice Skates

    传送门 这一题基础是二分图匹配,并且要知道一个 $Hall$ 定理:对于二分图能完全匹配的充要条件是,设点数少的那边为左边,点数为 $n$,对于 $k \in [1,n]$ ,左边任意 $k$ 个点, ...