青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

無我

讓內心永遠燃燒著偉大的光明的精神之火!
靈活的思考,嚴謹的實現
豪邁的氣魄、頑強的意志和周全的思考

A*算法實現

最近實現了一下A*算法,感覺蠻好的,尤其是修改地圖然后看電腦正確尋路后的那種成就感,有點像小時候蹲在地上,看著一堆螞蟻搬家,然后故意在他們的路上設置障礙物,然后看螞蟻不停的探索,然后重新找到新的路線的感覺,真是很有意思。
好!把代碼記錄在此,便于以后參考。

  1#include <iostream>
  2#include <string>
  3#include <vector>
  4#include <list>
  5#include <map>
  6#include <set>
  7
  8using namespace std;
  9
 10/************************************************************************/
 11/* A*算法實現,測試A*算法地圖      
 1240X10的地圖,B代表起始點,E代表終點;                                              
 13空格代表能通過;|代表是墻,不能通過;
 14xx0123456789012345678901234567890123456789xx
 15xx————————————————————xx
 160|                                        |0
 171|                                        |1
 182|                 |                      |2
 193|                   |                      |3
 204|                 |        E             |4
 215|    B            |                      |5
 226|                 |                      |6
 237|                                        |7
 248|                                        |8
 259|                                        |9
 26xx————————————————————xx
 27xx0123456789012345678901234567890123456789xx
 28/************************************************************************/

 29const static int X = 40;
 30const static int Y = 10;
 31//地圖上的情況
 32enum E_Map
 33{
 34    E_River=-2,            //有河流,無法通過,在地圖上用 ~ 標出
 35    E_Wall=-1,            //有墻,無法通過,在地圖上用 | 標出    
 36    E_Road = 0,            //沒有障礙物,能最快的順利通行,代價為0,在地圖上用空格標出    
 37    E_Sand=1,            //是沙地,能通過,但是相對難一些,代價為1,在地圖上用 * 標出
 38}
;
 39
 40struct Point
 41{
 42    int x;
 43    int y;
 44    Point(int i=0,int j=0):x(i),y(j){}
 45    bool operator==(const Point & r)
 46    {
 47        return (x==r.x)&&(y==r.y);
 48    }

 49}
;
 50bool operator==(const Point& l,const Point & r)
 51{
 52    return (l.x==r.x)&&(l.y==r.y);
 53}

 54bool operator<(const Point& l,const Point & r)
 55{
 56    if(l.y<r.y)    return true;
 57    else if(l.y>r.y)    return false;
 58    else    return (l.x < r.x);
 59}

 60
 61//const static int GameMap[Y][X] = {
 62//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 63//    0,0,-2,-2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 64//    0,0,0,-2,-2,-2,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
 65//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,-2,-2,-2,0,0,0,0,0,0,
 66//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,-2,0,0,0,0,0,
 67//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,
 68//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 69//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 70//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 71//    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 72//};
 73
 74//const static int GameMap[Y][X] = {
 75//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 76//    0,0,-2,-2,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 77//    0,0,0,-2,-2,-2,0,0,-1,0,-1,0,0,0,0,0,0,-1,-1,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
 78//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-1,-1,0,0,0,0,0,-1,-1,0,0,0,0,0,-2,-2,-2,0,0,0,0,0,0,
 79//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-2,-2,0,0,0,0,0,
 80//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,
 81//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 82//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,
 83//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 84//    0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 85//};
 86
 87const static int GameMap[Y][X] = {
 88    0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 89    0,0,-2,-2,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 90    0,0,0,-2,-2,-2,0,-1,-1,0,0,0,0,0,0,0,0,-1,-1,0,0,0,-1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
 91    0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,-1,-1,0,0,0,0,0,-2,-2,-2,0,0,0,0,0,0,
 92    0,0,0,0,0,-1,0,0,-1,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-2,-2,0,0,0,0,0,
 93    0,0,0,0,0,-1,0,0,-1,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,-2,0,0,0,0,0,
 94    0,0,0,0,0,-1,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 95    0,0,0,0,0,-1,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,
 96    0,0,0,0,0,0,-1,0,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
 97    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
 98}
;
 99
100//打印地圖
101void PrintMap(const Point &B,const Point &E,const vector<Point>& path=vector<Point>());
102void PrintMap(const Point &B,const Point &E,const vector<Point>& path)
103{
104    int LastMap[Y][X] = {0};
105    for (int y=0;y<Y;++y)
106    {
107        for (int x=0;x<X;++x)
108        {
109            LastMap[y][x] = GameMap[y][x];
110        }

111    }

112    //路徑
113    vector<Point>::const_iterator itr = path.begin();
114    for (;itr != path.end();++itr)
115    {
116        LastMap[(*itr).y][(*itr).x] = '&';
117    }

118    //起始和目標
119    LastMap[B.y][B.x] = 'B';
120    LastMap[E.y][E.x] = 'E';
121
122    cout<<"A*尋路路徑為:"<<endl;
123    cout<<"xx0123456789012345678901234567890123456789xx"<<endl;
124    cout<<"xx————————————————————xx"<<endl;
125    for (int y=0;y<Y;++y)
126    {
127        cout<<y<<"[";
128        for (int x=0;x<X;++x)
129        {
130            if (LastMap[y][x] == E_Road)
131            {
132                cout<<" ";
133            }

134            else if (LastMap[y][x] == E_Wall)
135            {
136                cout<<"|";
137            }

138            else if (LastMap[y][x] == E_River)
139            {
140                cout<<"~";
141            }

142            else if (LastMap[y][x] == E_Sand)
143            {
144                cout<<"*";
145            }

146            else if (LastMap[y][x] == 'B')
147            {
148                cout<<"B";
149            }

150            else if (LastMap[y][x] == 'E')
151            {
152                cout<<"E";
153            }

154            else if (LastMap[y][x] == '&')
155            {
156                cout<<"&";
157            }

158        }

159        cout<<"]"<<y<<endl;
160    }

161    cout<<"xx————————————————————xx"<<endl;
162    cout<<"xx0123456789012345678901234567890123456789xx"<<endl;
163}

164
165//計算當前位置與終點位置的Hn
166double Hn(const Point & E,const Point&p)
167{
168    return abs(E.y-p.y) + abs(E.x-p.x);
169}

170
171//計算相鄰兩個位置(即包括對象線在內的周圍8個坐標)的相對Gn
172double Gg(const Point & p1,const Point& p2)
173{
174    double d = GameMap[p2.y][p2.x];
175    return ((p1.x-p2.x)!=0&&(p1.y-p2.y)!=0)?(1.5+d):(1.0+d);
176}

177
178//探測位置p的下一步(p.x + addx,p.y + addy)的Gn,Hn
179void testNext(const Point & E,const Point&p,const set<Point>& closeTbl,
180    map<Point,double> &mapGn,map<Point,double> &mapGnTemp,
181    multimap<double,Point> &HnPoint,int addx,int addy)
182{
183    int x = p.x + addx;
184    int y = p.y + addy;    
185    if (x>=0 && y>=0 && x<&& y<&& GameMap[y][x]>=0)
186    {
187        Point t = Point(x,y);
188        if (closeTbl.find(t) != closeTbl.end())
189        {
190            return;
191        }

192        //得到對應本次遍歷的Gn
193        double dgn = mapGn[p] + Gg(p,t);
194        mapGnTemp[t] = dgn;
195
196        map<Point,double>::iterator itr = mapGn.find(t);
197        if (itr == mapGn.end() || itr->second > dgn)
198        {
199            mapGn[t] = dgn;
200        }

201        HnPoint.insert(make_pair(Hn(E,t),t));
202    }

203}

204
205bool APath(const Point & B,const Point & E,vector<Point>&path)
206{    
207    //A*算法:Fn = Gn + Hn
208    path.clear();
209    vector<Point> openTbl;
210    openTbl.push_back(B);
211    set<Point>    closeTbl;
212    closeTbl.insert(B);
213    map<Point,double> mapGn;
214    mapGn[B] = 0;
215    while(!openTbl.empty())
216    {
217        Point p = openTbl.back();
218        openTbl.pop_back();
219        if (p == E)
220        {
221            path.push_back(E);
222            break;
223        }

224        //multimap<double,Point> FnPoint;
225        multimap<double,Point> HnPoint;    //當前位置周圍所有可選擇的位置到終點的Hn
226        map<Point,double> mapGnTemp;    //當前位置周圍所有可選擇的位置到起點的Gn
227
228        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,-1,-1);        //左上位置
229        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,-1,0);        //左邊位置
230        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,-1,1);        //左下位置
231        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,0,-1);        //上面位置
232        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,0,1);            //下面位置
233        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,1,-1);        //右上位置
234        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,1,0);            //右邊位置
235        testNext(E,p,closeTbl,mapGn,mapGnTemp,HnPoint,1,1);            //右下位置
236        if (HnPoint.empty())
237        {
238            //無路可走了,只能一步一步回退。。。
239
240            //PrintMap(B,E,path);
241            //標記該點已經被探測,使得下次不再被選擇
242            closeTbl.insert(p);
243            //回退一步,重新探測之前走過的一個點
244            if (path.empty())
245            {
246                return false;
247            }

248            p = path.back();
249            path.pop_back();
250            closeTbl.erase(p);
251            openTbl.push_back(p);
252            continue;
253        }

254
255        //HnPoint的第一維就是從p點開始到達終點(Hn)最高效的周圍坐標點pt
256        multimap<double,Point>::iterator  itr = HnPoint.begin();
257        double hn = itr->first;
258        Point pt = itr->second;
259
260        map<Point,double>::iterator itrFind = mapGn.find(pt);
261        while (itrFind != mapGn.end() && (itrFind->second) < mapGnTemp[pt])
262        {
263            //如果這個不是最優,則優先試探其他的相同Hn的路徑
264            ++itr;
265            if (itr != HnPoint.end() )
266            {
267                if (hn < itr->first)
268                {
269                    break;
270                }

271                pt = itr->second;
272                itrFind = mapGn.find(pt);
273            }

274            else
275                break;
276        }

277        //判斷pt是否被探測過
278        if (itrFind != mapGn.end() && (itrFind->second) < mapGnTemp[pt])
279        {
280            /**************************************************************************************
281            pt已經被探測過,并且之前的Gn更小,說明可以用更小的代價到達pt。
282            所以說明我們之前選擇的p點不是最佳選擇,首先應該標記p無效,然后回退到之前的坐標重新選擇!
283            ****************************************************************************************/

284            //PrintMap(B,E,path);
285            //標記該點已經被探測,使得下次不再被選擇
286             closeTbl.insert(p);
287            //回退一步,重新探測之前走過的一個點
288            p = path.back();
289            path.pop_back();
290            closeTbl.erase(p);
291            openTbl.push_back(p);
292            continue;
293        }
    
294
295        //pt沒有被探測過,或者是最優選項,所以將p加入路徑,然后下一步探測pt 
296        openTbl.push_back(pt);
297
298        closeTbl.insert(p);
299        path.push_back(p);
300    }
    
301    return !path.empty();
302}

303
304int main(int argc, char * argv[])
305{
306    const Point B(4,5),E(36,4);
307    vector<Point> path;
308    bool bFind = APath(B,E,path);
309    
310    PrintMap(B,E,path);
311    if (!bFind)
312    {
313        cout<<"++++++找不到可達路徑!+++++++++"<<endl;
314    }

315
316    return 0;
317}

 


最上面注釋里面畫的地圖是為了簡單演示地圖最終的顯示效果,其實代碼二維數組給出的地圖有趣多了。

posted on 2012-11-05 09:04 Tim 閱讀(1850) 評論(0)  編輯 收藏 引用 所屬分類: 游戲編程C/C++語言

<2012年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

導航

統計

公告

本博客原創文章,歡迎轉載和交流。不過請注明以下信息:
作者:TimWu
郵箱:timfly@yeah.net
來源:www.shnenglu.com/Tim
感謝您對我的支持!

留言簿(9)

隨筆分類(173)

IT

Life

搜索

積分與排名

最新隨筆

最新評論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            猛男gaygay欧美视频| 欧美日韩精品一区| 国产一区二区三区在线观看精品| 亚洲摸下面视频| 亚洲视频碰碰| 国产一区欧美| 欧美二区在线播放| 欧美日本亚洲韩国国产| 亚洲视频久久| 欧美亚洲在线播放| 亚洲国产精品传媒在线观看| 亚洲国产精品黑人久久久| 欧美日韩国产小视频| 午夜欧美精品| 免费欧美在线| 午夜日韩在线观看| 久久在线精品| 亚洲婷婷国产精品电影人久久| 亚洲欧美日韩中文视频| 黄色精品一区二区| 亚洲精品国产系列| 国产日本欧美在线观看| 亚洲福利专区| 国产麻豆91精品| 亚洲国产精品美女| 国产欧美精品xxxx另类| 亚洲激情电影中文字幕| 国产精品一香蕉国产线看观看 | 91久久在线观看| 99国产成+人+综合+亚洲欧美| 国产女主播一区二区| 亚洲第一综合天堂另类专| 国产精品国色综合久久| 欧美成人免费在线视频| 国产精品毛片| 亚洲人妖在线| 亚洲国产99| 欧美在线观看一区二区| 亚洲天堂av图片| 欧美~级网站不卡| 久久裸体艺术| 国产精品一页| 在线一区二区日韩| 亚洲美女色禁图| 久久午夜精品一区二区| 久久成人av少妇免费| 欧美日韩视频专区在线播放| 欧美成人午夜免费视在线看片| 国产日韩免费| 亚洲一区二区三区欧美| 中日韩高清电影网| 欧美粗暴jizz性欧美20| 欧美色欧美亚洲另类二区| 蜜桃av综合| 亚洲成色777777在线观看影院| 午夜欧美精品| 欧美一区二区私人影院日本| 国产精品久久久久久妇女6080 | 久久精品国产一区二区三区免费看 | 久久不射网站| 欧美在线91| 国产精品亚洲美女av网站| 一区二区三区欧美在线观看| 一区二区精品| 欧美日韩中文字幕在线视频| 亚洲欧洲日韩综合二区| 亚洲精品一区久久久久久| 欧美激情国产精品| 亚洲人成人一区二区在线观看| 亚洲精品在线二区| 欧美韩国在线| 99热这里只有精品8| 亚洲视频在线一区观看| 国产精品mm| 欧美呦呦网站| 嫩草国产精品入口| 亚洲欧洲日本mm| 欧美日韩高清区| 一区二区精品国产| 香蕉成人伊视频在线观看| 国产日韩欧美中文| 久久综合狠狠综合久久激情| 欧美韩国在线| 亚洲午夜在线观看| 国产日韩精品久久久| 久久精品国产久精国产爱| 欧美成人免费va影院高清| 91久久久久久久久久久久久| 欧美片在线播放| 亚洲你懂的在线视频| 久久永久免费| 一本一本久久| 国内成+人亚洲+欧美+综合在线| 久久综合九色综合久99| 亚洲免费av电影| 久久久国产精品亚洲一区| 亚洲国产小视频在线观看| 欧美三区在线| 久久躁日日躁aaaaxxxx| 99精品国产99久久久久久福利| 久久av一区二区三区漫画| 91久久国产综合久久蜜月精品| 欧美三级精品| 久久综合九九| 午夜精品www| 亚洲精品视频在线| 久久婷婷亚洲| 午夜久久一区| 亚洲免费激情| 樱桃视频在线观看一区| 国产精品久久久久aaaa| 欧美/亚洲一区| 欧美一区二区三区免费视频| 亚洲精品极品| 蜜桃精品一区二区三区| 西西裸体人体做爰大胆久久久| 91久久久亚洲精品| 激情欧美一区| 国产欧美日韩精品a在线观看| 欧美人与性动交α欧美精品济南到| 午夜激情综合网| 在线视频免费在线观看一区二区| 欧美高清视频在线观看| 久久久久国产免费免费| 香蕉尹人综合在线观看| 亚洲在线视频| 在线天堂一区av电影| 最近看过的日韩成人| 在线免费观看日本欧美| 国产字幕视频一区二区| 国产精品免费网站| 欧美日韩在线观看一区二区| 欧美精品电影| 免费日韩av片| 欧美**人妖| 欧美 日韩 国产精品免费观看| 久久久亚洲综合| 久久综合国产精品台湾中文娱乐网| 欧美一级久久久| 亚洲免费在线观看视频| 亚洲女优在线| 亚洲欧美激情在线视频| 亚洲伊人色欲综合网| 国产精品99久久久久久白浆小说| 亚洲美女电影在线| 亚洲麻豆国产自偷在线| 亚洲美女黄色| 亚洲午夜激情在线| 亚洲一区高清| 欧美一进一出视频| 久久久久国内| 欧美精品v国产精品v日韩精品| 欧美国产精品v| 欧美日韩视频在线一区二区| 国产精品成人观看视频国产奇米| 欧美日韩视频第一区| 国产精品午夜春色av| 国产亚洲精品bt天堂精选| 黄色欧美日韩| 亚洲精品资源美女情侣酒店| 夜久久久久久| 欧美一区二区三区日韩视频| 久久狠狠一本精品综合网| 久久亚洲捆绑美女| 欧美激情精品久久久久久黑人| 亚洲韩国日本中文字幕| 一区二区三区久久网| 久久精品91| 欧美精品日韩| 国产欧美日韩中文字幕在线| 亚洲二区视频| 亚洲在线观看| 麻豆freexxxx性91精品| 最新国产成人av网站网址麻豆| 一本色道久久综合亚洲二区三区| 香蕉久久夜色精品| 你懂的一区二区| 国产精品视频免费观看| 亚洲第一天堂无码专区| 中日韩美女免费视频网址在线观看 | 亚洲国产一区二区三区青草影视 | 欧美制服第一页| 欧美福利视频在线观看| 一区二区三区视频在线观看| 久久久久久久波多野高潮日日| 欧美日韩一区二区三区视频| 国产无遮挡一区二区三区毛片日本| 亚洲经典自拍| 久久久久成人精品| 亚洲视频免费在线观看| 美女视频黄 久久| 国产揄拍国内精品对白| 一区二区av在线| 欧美.www| 欧美在线免费视频| 欧美性猛交xxxx乱大交蜜桃| 亚洲国产综合在线| 久久久久亚洲综合| 亚洲私人黄色宅男| 欧美日韩亚洲高清一区二区|