有问题或者写的不对的地方 欢迎交流指正~
#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;
}