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

<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

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

时间: 2024-11-05 19:27:06

【OJ】A*(start)算法c++初步实现的相关文章

c语言-基于C语言,用蚁群算法求最优路径。百度复制粘贴的别来了。。。要求可以直接运行的代码哈

问题描述 基于C语言,用蚁群算法求最优路径.百度复制粘贴的别来了...要求可以直接运行的代码哈 一个人从上海大学出发,经过若干个地点,路线不重复走,最后回到上海大学,找三条优化路线. 上海大学:北纬N31°19′5.86″ 东经E121°23′21.52″ 星雨城:北纬N31°19′46.58″ 东经E121°24′9.29″ 大康公寓:北纬N31°19′18.88″ 东经E121°25′3.98″ 文景楼:北纬N22°35′23.78″ 东经E113°52′50.67″ 大场中学:北纬N31°

浅析百度绿萝算法及其SEO应对方法

自从百度的绿萝算法于2月19日发布,到现在已经几天了,据网友在微博和QQ群反映,这几天不少网站遭受到降权甚至是被K.虽然这些被降权甚至是被K的网站大部分是有过买卖链接的嫌疑,但是也存在误杀的可能. 据百度绿萝算法公告,这次算法更新主要是打击买卖链接和链接买卖中介网站.但是据笔者观察,一部分购买黄金链的网站在这次算法中却没有受到任何影响.各位可看以下截图: 为什么购买黄金链的网站却没有受到这次算法影响而降权呢?据一个黄金链的客服介绍:"现在都是大家的猜测,百度要是能改变链接的算法 早就改变了,也不

JavaScript数据结构与算法之栈与队列_基础知识

学习起因 曾经有一次在逛V2EX时,碰到这么一个帖子. 数学完全还给老师了,想学回一些基础数学,大概是高中程度的,有什么书籍推荐? 发帖的楼主大学没有高数课程,出去工作时一直在从事前端的工作.感觉到数学知识的匮乏,所以想补一补数学. 看了看帖子,感觉和我很像,因为我的专业是不开高数的,我学的也是前端.也同样感觉到了数学知识匮乏所带来的困顿.同时因为自己的数学思维实在是不怎么好,所以决定努力补习数学与计算机基础知识. 当时也有人说:"前端需要什么数据结构与算法",但是对于这个事情我有自己

《高性能科学与工程计算》——3.3 案例分析:Jacobi算法

3.3 案例分析:Jacobi算法 Jacobi算法是数值分析和模拟中许多基于stencil循环方法的原型.在其最简单的形式中,可以用来求解一个标量函数Φ (r→, t)的扩散方程: 求解一个长方形区域的狄利克雷边界条件.当使用有限差分法时,其微分算子是离散的(在不丧失一般性的前提下,这里我们限定为二维方程.但请分析习题3.4中,二维和三维性能的区别). https://yqfile.alicdn.com/8804c4dad97f4db8d05562192a51a3edce664c51.png"

大数据理论遇上新兴分析工具 挑战无处不在

对于大数据,有观点认为有了足够大的数据集,分析的统计方法就是非必要的.我们将其称为"N等价于所有"的理论.而按这样的说法,抽样和推理都是浪费时间.拥有了所有的数据,就只需让数据说话. 虽然"N等价于所有"的理论在短短几年前还是革命性的产物,作为正在上线的新颖而且更具潜在价值的分析方法,它很快就过时了.对于将所有数据对应一个给定主题这样的概念,物联网(IoT)分析和认知计算这对大数据的流行观点带来了挑战,而且这也要求那些分析专家重新对他们的做法进行评估. "

六:分布式事务一致性协议paxos的分析

最近研究paxos算法,看了许多相关的文章,概念还是很模糊,觉得还是没有掌握paxos算法的精髓,所以花了3天时间分析了libpaxos3的所有代码,此代码可以从https://bitbucket.org/sciascid/libpaxos 下载.对paxos算法有初步了解之后,再看此文的效果会更好:如果你也想分析libpaxos3的话,此文应该会对你有不小帮助:关于paxos的历史这里不多做介绍,关于描述paxos算法写的最好的一篇文章应该就是维基百科了,地址戳这里:http://zh.wik

C++的一题OJ算法竞赛题,求解析(最好附上代码)

问题描述 C++的一题OJ算法竞赛题,求解析(最好附上代码) 小明的密码由N(1<=N<=12)个数字构成,每个数字都可以是0至9中任意一个数字,但小明的密码还有 一个特点就是密码中连续的M(1<=M<=4)个数字的和是质数,现给定M和N,求满足条件的密码共有多少 个? 解决方案 http://gouwu.baidu.com/question/2204084031584739588.html?entry=qb_browse_default 解决方案二: 能给个OJ链接吗? 这题我也

算法-九度oj 题目1144:Freckles,不能通过,为什么超时间?

问题描述 九度oj 题目1144:Freckles,不能通过,为什么超时间? #include #include #include using namespace std; const int maxn = 5000; const double INF = 1000000000; bool vis[maxn] = {false}; double x[maxn],y[maxn]; int n ; int father[maxn]; struct Node{ double u,v; double c

C语言及程序设计初步例程-39 求素数算法

贺老师教学链接  C语言及程序设计初步 本课讲解 判别m是否为素数 #include <stdio.h> int main() { int i, m; int is_prime=1; scanf("%d", &m); for(i=2; i<=m-1; i++) { if(m%i==0) is_prime=0; } if(is_prime==1) printf("%d 是素数!\n", m); else printf("%d 不是素