【OJ】A*(start)算法c++初步实现

简介: /* A* 算法 2014/11/5 吴成兵 改进中 BFS是A*算法中最笨的一种 */#include#include#include#include#include#includeusing namespace std;co...



<span style="font-size:14px;">/*
	A* 算法 2014/11/5 吴成兵 
	改进中 
	BFS是A*算法中最笨的一种 
*/
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>

using namespace std;
const int INF=888;//200
char a[11][11];

// 起点和终点可以任意修改 //坐标原点在左上角,行为y,横列为x 
const int sy=1,sx=3,ey=8,ex=2;//开始(1,3) 目的(5,2) 

int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};//四个方向(本来是八个) 

struct FIELD{
	int f,g,h;  //h=f+g
	int y,x;    //f为开始到本地距离,g为本地到目的地距离 
}b[10][10];
////priority_queue<int,vector<int>,greater<int> >pq;
//bool cmp(const FIELD &a,const FIELD &b){
//	return a.h>b.h;
//}
struct cmp{                         //用于构造逆的优先队列 
	bool operator()(const FIELD a,const FIELD b)const{
		return a.h>b.h;
	}
};

void A(){
	priority_queue<FIELD,vector<FIELD>,cmp>q;
	q.push(b[sy][sx]);
	while(!q.empty()){
		FIELD f=q.top();q.pop();//FIELD
		if(f.x==ex&&f.y==ey)break;
		for(int i=0;i<4;i++){
			int nx=f.x+dx[i],ny=f.y+dy[i];
			if(nx>=0&&nx<10&&ny>=0&&ny<10&&a[ny][nx]!='#'&&b[ny][nx].h==INF/**/){
				FIELD next;     //FIELD
				/*h=f+g*/
				next.f=sqrt(pow(ny-sy,2)+pow(nx-sx,2))*10;//到起点10倍距离 //?墙 
				next.g=(fabs(ny-ey)+fabs(nx-ex))*10;      //xy方向到终点10倍距离 
				next.h=next.f+next.g;
				next.y=ny; next.x=nx; 
				
				b[ny][nx].h=next.h;//存数值 
				b[ny][nx].f=next.f;//
				b[ny][nx].g=next.g;//
				
				q.push(next);
				
				if(ny!=ey||nx!=ex) //用&&会断路效应 
					a[ny][nx]='.';
			}
		} 
	} 
}

int main(){
	
//	memset(b,-1,sizeof(b));
	for(int i=0;i<10;i++){
		for(int j=0;j<10;j++){
			b[i][j].h=INF;
		}
	}
	a[3][2]=a[3][3]=a[3][4]=a[3][5]=a[3][6]=a[2][7]='#';  //栅栏可以任意修改 
	a[sy][sx]='*';a[ey][ex]='$';                  //起点和终点标志 
//	for(int i=0;i<11;i++)a[10][i]='-';
	for(int i=0;i<10;i++)a[i][10]='|';            //用于显示边界 
	b[sy][sx].h=b[sy][sx].f=b[sy][sx].g=0;
	b[sy][sx].y=sy;b[sy][sx].x=sx;
	
	A();/**/ 
////	
////	pq.push(2);
////	pq.push(12);
////	pq.push(2);
////	pq.push(32);
////	while(!pq.empty()){
////		cout<<pq.top()<<endl;
////		pq.pop();
////	}

	for(int i=0;i<10;i++){//11           //输出地图 
		for(int j=0;j<11;j++)cout<<a[i][j];cout<<endl;
	}
	for(int i=0;i<10;i++){              //输出数值图 
		for(int j=0;j<10;j++){
//			if(b[i][j].h==INF)cout<<"    ";
//			else 
				printf("%3d",b[i][j].h);
//			cout<<i<<" "<<j<<" "<<b[i][j].f<<" "<<b[i][j].g<<" "<<b[i][j].h<<endl;
		}
		cout<<endl;
	}
	return 0;
}
</span>


**Wu_Being博客声明**:本人博客欢迎转载,请标明博客原文和原链接!谢谢! 

《A*(start)算法c++初步实现》:

http://blog.csdn.net/u014134180/article/details/40838319


如果你看完这篇博文,觉得对你有帮助,并且愿意付赞助费,那么我会更有动力写下去。


目录
相关文章
|
2月前
|
算法 测试技术 C++
【动态规划算法】蓝桥杯填充问题(C/C++)
【动态规划算法】蓝桥杯填充问题(C/C++)
|
2月前
|
存储 算法 C++
高精度算法(加、减、乘、除,使用c++实现)
高精度算法(加、减、乘、除,使用c++实现)
562 0
高精度算法(加、减、乘、除,使用c++实现)
|
2月前
|
算法 数据处理 C++
c++ STL划分算法;partition()、partition_copy()、stable_partition()、partition_point()详解
这些算法是C++ STL中处理和组织数据的强大工具,能够高效地实现复杂的数据处理逻辑。理解它们的差异和应用场景,将有助于编写更加高效和清晰的C++代码。
27 0
|
2月前
|
存储 算法 决策智能
【算法】博弈论(C/C++)
【算法】博弈论(C/C++)
|
2月前
|
存储 算法 C++
【算法】哈希映射(C/C++)
【算法】哈希映射(C/C++)
|
2月前
|
机器学习/深度学习 人工智能 算法
【算法】最长公共子序列(C/C++)
【算法】最长公共子序列(C/C++)
|
2月前
|
人工智能 算法 BI
一篇带你速通差分算法(C/C++)
一篇带你速通差分算法(C/C++)
|
2月前
|
人工智能 算法 C++
一篇带你速通前缀和算法(C/C++)
一篇带你速通前缀和算法(C/C++)
|
2月前
|
存储 算法 C++
弗洛伊德(Floyd)算法(C/C++)
弗洛伊德(Floyd)算法(C/C++)
|
2月前
|
存储 算法 程序员
迪杰斯特拉(Dijkstra)算法(C/C++)
迪杰斯特拉(Dijkstra)算法(C/C++)