亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? findpath.c

?? c語言實現(xiàn)的A*算法
?? C
字號:
/* 云風的求解最短路徑代碼 (Cloud Wu's Pathfinding code)
 *                          1999 年 1月 8 日 (1999, Jan 8)
 * 這段代碼沒有進行任何優(yōu)化(包括算法上的), 但不意味我不知道該怎樣優(yōu)化它,
 * 它是為教學目的而做,旨在用易于理解和簡潔的代碼描述出 A* 算法在求最段路
 * 徑中的運用. 由于很久沒有摸算法書, 本程序不能保證是純正的 A* 算法 ;-)
 * 你可以在理解了這段程序的基礎上,按自己的理解寫出類似的代碼. 但是簡單的
 * 復制它到你的程序中是不允許的,如果你真要這樣干,請在直接使用它的軟件的
 * 文檔中,寫上我的名字 ;-)
 * 有任何的問題,或建議請 E-mail 到 cloudwu@263.net 
 * 歡迎參觀我的主頁 http://www.netease.com/~cloudwu (云風工作室)
 * (你可以在上面找到一些有關這個問題的討論,和有關游戲設計的其它大量資料)
 *
 * 本程序附帶有一個數(shù)據(jù)文件 map.dat, 保存有地圖的數(shù)據(jù)
 */

// #define NDEBUG
#include <stdio.h>
#include <conio.h>
#include <assert.h>
#include <stdlib.h>
#define MAPMAXSIZE 100  //地圖面積最大為 100x100
#define MAXINT 8192     //定義一個最大整數(shù), 地圖上任意兩點距離不會超過它
#define STACKSIZE 65536 //保存搜索節(jié)點的堆棧大小

#define tile_num(x,y) ((y)*map_w+(x))  //將 x,y 坐標轉換為地圖上塊的編號
#define tile_x(n) ((n)%map_w)          //由塊編號得出 x,y 坐標
#define tile_y(n) ((n)/map_w)

// 樹結構, 比較特殊, 是從葉節(jié)點向根節(jié)點反向鏈接
typedef struct node *TREE;

struct node {
	int h;
        int tile;
	TREE father;
	} ;

typedef struct node2 *LINK;

struct node2 {
       TREE node;
       int f;
       LINK next;
       };

LINK queue;               // 保存沒有處理的行走方法的節(jié)點
TREE stack[STACKSIZE];    // 保存已經處理過的節(jié)點 (搜索完后釋放)
int stacktop;
unsigned char map[MAPMAXSIZE][MAPMAXSIZE];   //地圖數(shù)據(jù)
int dis_map[MAPMAXSIZE][MAPMAXSIZE];         //保存搜索路徑時,中間目標地最優(yōu)解

int map_w,map_h;                             //地圖寬和高
int start_x,start_y,end_x,end_y;             //地點,終點坐標

// 初始化隊列
void init_queue()
{
 queue=(LINK)malloc(sizeof(*queue));
 queue->node=NULL;
 queue->f=-1;
 queue->next=(LINK)malloc(sizeof(*queue));
 queue->next->f=MAXINT;
 queue->next->node=NULL;
 queue->next->next=NULL;
}

// 待處理節(jié)點入隊列, 依靠對目的地估價距離插入排序
void enter_queue(TREE node,int f)
{
 LINK p=queue,father,q;
 while(f>p->f) {
   father=p;
   p=p->next;
   assert(p);
   }
 q=(LINK)malloc(sizeof(*q));
 assert(queue);
 q->f=f,q->node=node,q->next=p;
 father->next=q;
}

// 將離目的地估計最近的方案出隊列
TREE get_from_queue()
{
 TREE bestchoice=queue->next->node;
 LINK next=queue->next->next;
 free(queue->next);
 queue->next=next;
 stack[stacktop++]=bestchoice;
 assert(stacktop<STACKSIZE);
 return bestchoice;
}

// 釋放棧頂節(jié)點
void pop_stack()
{
 free(stack[--stacktop]);
}

// 釋放申請過的所有節(jié)點
void freetree()
{
 int i;
 LINK p;
 for (i=0;i<stacktop;i++)
    free(stack[i]);
 while (queue) {
   p=queue;
   free(p->node);
   queue=queue->next;
   free(p);
   }
}

// 估價函數(shù),估價 x,y 到目的地的距離,估計值必須保證比實際值小
int judge(int x,int y)
{
 int distance;
 distance=abs(end_x-x)+abs(end_y-y);
 return distance;
}

// 嘗試下一步移動到 x,y 可行否
int trytile(int x,int y,TREE father)
{
 TREE p=father;
 int h;
 if (map[y][x]!=' ') return 1; // 如果 (x,y) 處是障礙,失敗
 while (p) {
   if (x==tile_x(p->tile) && y==tile_y(p->tile)) return 1; //如果 (x,y) 曾經經過,失敗
   p=p->father;
   }
 h=father->h+1;
 if (h>=dis_map[y][x]) return 1; // 如果曾經有更好的方案移動到 (x,y) 失敗
 dis_map[y][x]=h; // 記錄這次到 (x,y) 的距離為歷史最佳距離

// 將這步方案記入待處理隊列
 p=(TREE)malloc(sizeof(*p));
 p->father=father;
 p->h=father->h+1;
 p->tile=tile_num(x,y);
 enter_queue(p,p->h+judge(x,y));
 return 0;
}

// 路徑尋找主函數(shù)
void findpath(int *path)
{
 TREE root;
 int i,j;
 stacktop=0;
 for (i=0;i<map_h;i++)
     for (j=0;j<map_w;j++)
         dis_map[i][j]=MAXINT;
 init_queue();
 root=(TREE)malloc(sizeof(*root));
 root->tile=tile_num(start_x,start_y);
 root->h=0;
 root->father=NULL;
 enter_queue(root,judge(start_x,start_y));
 for (;;) {
    int x,y,child;
    TREE p;
    root=get_from_queue();
    if (root==NULL) {
      *path=-1;
      return;
    }
    x=tile_x(root->tile);
    y=tile_y(root->tile);
    if (x==end_x && y==end_y) break; // 達到目的地成功返回

    child=trytile(x,y-1,root);  //嘗試向上移動
    child&=trytile(x,y+1,root); //嘗試向下移動
    child&=trytile(x-1,y,root); //嘗試向左移動
    child&=trytile(x+1,y,root); //嘗試向右移動
    if (child!=0)
       pop_stack();  // 如果四個方向均不能移動,釋放這個死節(jié)點
    }

// 回溯樹,將求出的最佳路徑保存在 path[] 中
 for (i=0;root;i++) {
    path[i]=root->tile;
    root=root->father;
    }
 path[i]=-1;
 freetree();
}

void printpath(int *path)
{
 int i;
 for (i=0;path[i]>=0;i++) {
    gotoxy(tile_x(path[i])+1,tile_y(path[i])+1);
    cprintf("\xfe");
    }
}

int readmap()
{
 FILE *f;
 int i,j;
 f=fopen("map.dat","r");
 assert(f);
 fscanf(f,"%d,%d\n",&map_w,&map_h);
 for (i=0;i<map_h;i++)
	fgets(&map[i][0],map_w+1,f);
 fclose(f);
 start_x=-1,end_x=-1;
 for (i=0;i<map_h;i++)
     for (j=0;j<map_w;j++) {
         if (map[i][j]=='s') map[i][j]=' ',start_x=j,start_y=i;
         if (map[i][j]=='e') map[i][j]=' ',end_x=j,end_y=i;
         }
 assert(start_x>=0 && end_x>=0);
 return 0;
}

void showmap()
{
 int i,j;
 clrscr();
 for (i=0;i<map_h;i++) {
    gotoxy(1,i+1);
    for (j=0;j<map_w;j++)
       if (map[i][j]!=' ') cprintf("\xdb");
       else cprintf(" ");
    }
 gotoxy(start_x+1,start_y+1);
 cprintf("s");
 gotoxy(end_x+1,end_y+1);
 cprintf("e");
}

int main()
{
 int path[MAXINT];
 readmap();
 showmap();
 getch();
 findpath(path);
 printpath(path);
 getch();
 return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩精品成人一区二区三区| 亚洲国产高清在线观看视频| 免费欧美在线视频| 日韩欧美一区二区不卡| 精品中文字幕一区二区| 久久综合资源网| 国产成人超碰人人澡人人澡| 国产精品高潮久久久久无| 91麻豆国产在线观看| 亚洲va在线va天堂| 精品国产伦一区二区三区观看体验 | 欧美在线不卡视频| 午夜视频久久久久久| 欧美变态tickle挠乳网站| 国产精品18久久久久久久网站| 日本一区二区免费在线观看视频| 成人免费av资源| 亚洲国产aⅴ成人精品无吗| 精品日韩在线一区| 9人人澡人人爽人人精品| 婷婷六月综合网| 2014亚洲片线观看视频免费| 99精品欧美一区二区三区小说| 亚洲午夜日本在线观看| www精品美女久久久tv| 色女孩综合影院| 极品少妇xxxx精品少妇| 亚洲欧美综合另类在线卡通| 欧美麻豆精品久久久久久| 成人午夜在线免费| 婷婷综合在线观看| 国产精品久久久久久久久久免费看 | 日韩女优av电影| 日本韩国欧美三级| 国产制服丝袜一区| 一区二区三区在线观看视频 | 久久精品一区二区三区不卡| 色婷婷综合久久久久中文一区二区 | 国产自产2019最新不卡| 亚洲在线视频免费观看| 国产亚洲婷婷免费| 制服丝袜av成人在线看| www.欧美精品一二区| 麻豆中文一区二区| 亚洲精品成人悠悠色影视| 久久亚洲免费视频| 欧美色网站导航| 99久久综合精品| 国产乱码一区二区三区| 日韩综合小视频| 亚洲午夜激情网页| 亚洲精品一卡二卡| 中文天堂在线一区| 久久久久久97三级| 日韩三级.com| 555www色欧美视频| 欧美日免费三级在线| 91色在线porny| 丁香婷婷综合色啪| 国内精品国产成人| 欧美aa在线视频| 人人精品人人爱| 午夜欧美在线一二页| 一区二区免费看| 亚洲一区免费在线观看| 专区另类欧美日韩| 亚洲精品自拍动漫在线| 中文字幕一区免费在线观看 | 日韩欧美在线综合网| 欧美高清视频www夜色资源网| 91黄视频在线| 在线免费精品视频| 欧美视频一区二| 欧美在线视频你懂得| 欧美日韩一级二级| 欧美日韩五月天| 欧美精品第一页| 精品人伦一区二区色婷婷| 欧美一区二区美女| 精品久久国产字幕高潮| 精品国产凹凸成av人网站| 日韩精品一区二| www久久精品| 国产精品福利电影一区二区三区四区| 中文字幕av免费专区久久| 国产精品日产欧美久久久久| 亚洲日韩欧美一区二区在线| 亚洲欧美乱综合| 三级欧美韩日大片在线看| 日本在线不卡视频| 成人国产视频在线观看| 国产91精品一区二区麻豆网站| 丁香婷婷综合激情五月色| 国产福利91精品一区| 91丨porny丨首页| 欧美日韩国产片| 精品福利一二区| 国产精品视频免费| 亚洲国产精品久久久久秋霞影院| 午夜精品免费在线观看| 九色综合狠狠综合久久| 国产成人精品综合在线观看 | 日韩三级在线观看| 国产无人区一区二区三区| 综合分类小说区另类春色亚洲小说欧美| 亚洲视频你懂的| 秋霞午夜av一区二区三区| 国产精品羞羞答答xxdd| 色哟哟在线观看一区二区三区| 欧美精品v日韩精品v韩国精品v| 精品国产sm最大网站| 亚洲男人的天堂一区二区| 日韩在线卡一卡二| 懂色av中文一区二区三区| 欧美日韩一级视频| 欧美国产精品劲爆| 日韩电影免费在线观看网站| 国产不卡免费视频| 欧美日韩美女一区二区| 国产精品网友自拍| 天天操天天色综合| 不卡av在线免费观看| 欧美一区二区三区视频在线| 欧美激情在线一区二区| 日韩中文字幕av电影| 成人动漫在线一区| 91精品福利在线一区二区三区| 中文字幕一区三区| 国产精品白丝jk黑袜喷水| 欧美少妇一区二区| 欧美激情在线观看视频免费| 日韩制服丝袜先锋影音| 一本色道久久综合亚洲aⅴ蜜桃| 日韩精品一区二区三区视频在线观看 | 亚洲男人的天堂一区二区| 韩国精品主播一区二区在线观看| 91国偷自产一区二区开放时间| 久久久久久久久久久久久久久99| 亚洲成人黄色小说| 99国产精品国产精品久久| 久久夜色精品国产噜噜av| 精品在线免费视频| 欧美日韩国产一二三| 一区二区三区在线观看欧美| 国产99一区视频免费| 日韩免费电影网站| 午夜国产不卡在线观看视频| 99精品在线观看视频| 国产香蕉久久精品综合网| 激情欧美一区二区三区在线观看| 欧美日韩不卡在线| 亚洲电影一级黄| 欧美综合一区二区三区| 国产精品久久免费看| 国产成人福利片| 国产婷婷色一区二区三区 | 福利电影一区二区| 精品国产乱码久久久久久1区2区| 日本中文在线一区| 91精品国产综合久久久久久久| 亚洲福利视频导航| 欧美蜜桃一区二区三区| 亚洲第一二三四区| 欧美三区在线观看| 亚洲成a人v欧美综合天堂下载| 91福利精品第一导航| 亚洲欧美成人一区二区三区| 91日韩精品一区| 亚洲综合免费观看高清完整版 | 日韩精品专区在线影院重磅| 蜜臀av亚洲一区中文字幕| 欧美一卡二卡三卡四卡| 视频一区视频二区中文| 日韩你懂的在线播放| 国产一区亚洲一区| 国产欧美综合在线观看第十页 | 激情综合色播五月| 久久综合久久鬼色| 国产乱人伦偷精品视频不卡| 日本一区二区视频在线| caoporn国产一区二区| 中文字幕欧美一| 色妹子一区二区| 午夜精品久久一牛影视| 欧美电影免费观看完整版| 国产精品一区二区黑丝| 亚洲天堂成人网| 在线电影国产精品| 激情深爱一区二区| 亚洲视频综合在线| 欧美另类一区二区三区| 九一九一国产精品| 国产精品麻豆久久久| 在线国产电影不卡| 理论电影国产精品| 亚洲特黄一级片| 日韩色视频在线观看| 99久久久久免费精品国产| 亚洲国产视频a| 国产色婷婷亚洲99精品小说|