无障碍 Astar 地图为图结构 C++简单实现

本文介绍了使用C++实现无障碍地图上的A*(A-star)算法,旨在找出从起点到终点的最短路径。通过图结构进行路径搜索,适合于导航、游戏等场景。欢迎讨论指正。
摘要由CSDN通过智能技术生成

 有问题或者写的不对的地方 欢迎交流指正~

 #include<cstdio>
 #include<cstdlib>
 #include<cmath>
 #include<ctype.h>
 #include<ctime>
 #include<queue>
 #include<vector>
 
 using namespace std;
 #define INF (0x23333333)
 #define MAXN (302) 
 
 int g[15];
 int h[15];
 int f[15];
 bool in_open[10];
 bool in_close[10];
 int min;//记录最小的f值 
 int start_x,start_y,end_x,end_y;
 int start,end;
 bool flag = false;
 //2平米检测 返回的最近的拐点
 /*int matchpoint(int x,int y){
 	int num;
 	return num;
 }
 */ 
 struct Point{
 	int id;
 	int x,y,g,h,f;
 	//不用显式初始化定义结构体变量 
 	Point(){}
 	//只初始化…… 
 	Point(int _x,int _y):x(_x),y(_y) {}
 	
// 	bool operator<(const Point &o) const
// 	{
// 		return f>o.f;
//	 }
	friend bool operator < (Point p1,Point p2){
		return p1.f>p2.f;
	}
 }pt[20];
 
  vector<int> Adj[MAXN];
  queue<Point> path;
 void find_path(){
	 in_open[start] = true;
	priority_queue<Point> open_list;
 	open_list.push(pt[start]);//加起点
// 	path.push(pt[start]);
 	Point c,n;//当前点 ,邻接点 
 	for(int i=0;i<10;i++){
 		 pt[i].g =INF;
 		 pt[i].h = abs(pt[i].x-pt[end].x) + abs(pt[i].y-pt[end].y);
 		 pt[i].f = pt[i].g +pt[i].h;
	 }
 	while(open_list.size())
	 {
	 	c = open_list.top(); //最小的choose为当前的 
		path.push(c);
	 	printf("%d",c.id);
	 	if(c.id==end){ 
	 	flag = true;
		 break;//到终点则跳出循环 
	}
	 	open_list.pop(); //当前结点加入关闭列表中
	 	in_close[c.id] = true;
		 for(int i=0;i<Adj[c.id].size();i++){
		 	//对可到达的
		 	int num= Adj[c.id][i];
		 	n = pt[num];
			 if(in_close[n.id]) continue;//在关闭列表中则不处理
			 if(!in_open[n.id])
			 {
			 	//新节点
				 open_list.push(n); 
			  } else if((c.g+abs(n.x-c.x)+abs(n.y-c.y))<n.g){
			  	//是更好的解
				  path.push(n); 
				  n.g= c.g+abs(n.x-c.x)+abs(n.y-c.y);
			  }
		 } 			  
	  } 

 }
 
 void print_path()
 {
 	if(!flag){
 		printf("无法到达!\n");
 		return;
	 }
	//打印路径点
	while(!path.empty()){
		Point u = path.front();
		path.pop();
		printf("(%d,%d)\n",u.x,u.y);
	} 
 }
 
 int main()
{
	int num=0;
    int x,y,n,v;
   
    printf("请按如下格式输入地图:1,1 2 1 5 ");
    for(int i=0;i<10;i++){
    	scanf("%d,%d",&x,&y);
    
		pt[num] = Point(x,y); 
		pt[num].id = num;
		num++;
		scanf("%d",&n); 
		for(int j=0;j<n;j++){
  		scanf("%d",&v);
  		Adj[i].push_back(v);
 	 }
	}
	printf("打印地图\n");
	for(int i=0;i<10;i++){
		printf("%d: (%d,%d)",pt[i].id,pt[i].x,pt[i].y);
	}
	printf("\n");
	 printf("起点位置:");
	 scanf("%d",&start); 
	 printf("终点位置:");
	  scanf("%d",&end); 
	  printf("%d\n",Adj[0][1]);
//	  for(int i=0;i<10;i++){
//	  	for(int j=0;j<10;j++){
//	  		printf("%d\n",Adj[i][j]);
//		  }
//	  }
  /*   scanf("%d %d", &start_x, &start_y);
     start = matchpoint(start_x,start_y);
     scanf("%d %d", &end_x, &end_y);
     end = matchpoint(end_x,end_y);
	TEST PRINTF
	for(int i=0;i<num;i++){
		printf("%d,%d\n",pt[i].x,pt[i].y);
	}
*/
    find_path();
    print_path();
    return 0;


 } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值