A*算法 cocos2dx 8数码
Posted master-dragon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A*算法 cocos2dx 8数码相关的知识,希望对你有一定的参考价值。
入门讲解(下面是一篇英文入门,最经典,需要好好看)
http://www.policyalmanac.org/games/aStarTutorial.htm
网上的各种文章 只能参考,不可尽信(本文代码不是很好,可以参看学习,也可能错误,所以自己实践检验,Debug一步步看)
本文地址:http://blog.csdn.net/qq_26437925/article/details/52049011
输入 m n 每个位置的值
1 不可走
0 可走
2 起点
3 终点
样例输入
4 4
0 0 1 0
2 1 0 3
0 0 1 0
1 0 0 0
6 5
0 0 0 0 0
0 0 1 0 0
2 0 1 0 3
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
可采用freopen("in.txt", "r", stdin); 进行文本输入,因为自己写的,所以自己定义了结果,主要是学习Astar 算法流程
#include <cstdio>
#include <cmath>
#include <iostream>
#include <vector>
#include <queue>
#include <map>
#include <list>
#include <iterator>
using namespace std;
const int INF = 0x7fffffff;
const int N = 100;
int m, n;
int po[N][N];
int stai, staj;
int endi, endj;
int dir[4][2] =
0, 1 , // East
1, 0 , // South
0, -1 , // West
-1, 0 , // North
;
bool isRightPos(int i, int j)
if (i >= 0 && i < m && j >= 0 && j < n)
return true;
return false;
int fa[N][N];//父节点
int f[N][N];//f值
int g[N][N];//g值
int h[N][N];//h值
bool canReach[N][N];//是否是可以走
int distance(int x1, int y1, int x2, int y2)
return (x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2);
map<int, int> rs;// 存储路径,包括起点和终点
void astar()
map<int, int> open;//open表
map<int, int> close;//close表
open.clear();
close.clear();
open[stai*m + staj] = 0;
while (!open.empty())
// 取得open表的最小值
map<int, int>::iterator it = open.begin();
map<int, int>::iterator openMin;
int minx, miny, minf = INF;
while (it != open.end())
if (it->second < minf)
minf = it->second;
minx = it->first / m;
miny = it->first % m;
openMin = it;
it++;
// 到达终点 处理结果
if (minx == endi && miny == endj)
int fx= endi;
int fy = endj;
rs[endi*m + endj] = 1;
int tmpx = endi, tmpy = endj;
while ( (tmpx != stai) || (tmpy!= staj))
fx = fa[tmpx][tmpy] / m;
fy = fa[tmpx][tmpy] % m ;
tmpx = fx;
tmpy = fy;
//printf("%d %d\\n", endi, endj);
rs[tmpx*m + tmpy] = 1;
break;
// 遍历每个节点
for (int i = 0; i < 4; i++)
int nx = minx + dir[i][0];
int ny = miny + dir[i][1];
// 节点不合理 或者 在close表中 不做处理
if (!isRightPos(nx, ny) || !canReach[nx][ny] || close[nx*m + ny] != 0)
continue;
else
g[nx][ny] = distance(nx, ny, minx, miny);
f[nx][ny] = g[nx][ny] + h[nx][ny];
// 在open表中 需要比较f值
if (open[nx*m + ny] != 0)
if (f[nx][ny] < open[nx*m + ny])
open[nx*m + ny] = f[nx][ny];
else //直接加入到open表中
fa[nx][ny] = minx * m + miny;
open[nx*m + ny] = f[nx][ny];
close[minx*m + miny] = 1; //节点加入到close表中,并从open表中清除
open.erase(openMin);
//open[minx*m + miny] = 0;
// while
int main()
freopen("in.txt", "r", stdin);
int i, j;
while (scanf("%d%d", &m, &n) != EOF)
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
scanf("%d", &po[i][j]);
if (po[i][j] == 2)
stai = i;
staj = j;
if (po[i][j] == 3)
endi = i;
endj = j;
canReach[i][j] = true;
if (po[i][j] == 1)
canReach[i][j] = false;
<span style="white-space:pre"> </span>// h值可以先求出来,g值在atar算法过程中求解
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
h[i][j] = distance(i, j, endi, endj);
astar();
char Symbol[5][3] = "□", "▓", "▽", "☆", "◎" ;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
if (rs[i*m + j] == 1)
if (i == stai && j == staj)//起点
printf("%s", Symbol[2]);
else if (i == endi && j == endj)//终点
printf("%s", Symbol[3]);
else
printf("%s", Symbol[4]);//路径
else
if (po[i][j] == 1)
printf("%s", Symbol[1]); //障碍
else
printf("%s", Symbol[0]);//可走
printf("\\n");
rs.clear();
return (0);
结果输出如上图所示
----------------------------------------------------------------------------------------------
cocos2dx 8数码小程序
https://github.com/doctording/cocos2dx_8digital
如下图,点击之后可以实现自动拼图
以上是关于A*算法 cocos2dx 8数码的主要内容,如果未能解决你的问题,请参考以下文章
求八数码问题算法,并说明下该算法优缺点,要算法,不是源代码(可以没有)。