• <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>

            飛天

            快樂(lè)的生活......

             

            我的A*尋路算法

                   關(guān)于A*算法,可以參考:http://data.gameres.com/message.asp?TopicID=25439
                   以下是實(shí)現(xiàn)的代碼。
            AStar.cpp
            #include "StdAfx.h"
            #include 
            ".\astar.h"



            Node  CreateNode(
            int _x,int _y,int _value=0,Node * _parent=0)
            {
                
            return  Node(_x,_y,_value,_parent);
            }

            //重新排列開(kāi)始隊(duì)列
            bool sort_node(const Node * &node1,const Node * &node2)
            {
                
            return node1->value < node2->value ;
            }



            AStar::AStar(
            void)
            {
            }


            AStar::
            ~AStar(void)
            {
                
            //釋放空間
                for(int i=0;i<vec_begin.size();++i)
                    
            delete vec_begin[i];

                
            for(int k=0;k<vec_closed.size();++k);
                    
            delete vec_closed[0];

            }


            //轉(zhuǎn)入地圖文件初始化數(shù)組
            void AStar::Initalize(char * mapfile)
            {
                  ifstream fin(mapfile);
                  fin.getline(map[
            0],MAX_COL);
                  col
            =(int)strlen(map[0]);
                  row
            =0;
                  
            while(map[row][col]==NULL)
                  
            {
                     row
            ++;
                      fin.getline(map[row],MAX_COL);      
                  }


                  
            for(int i=0;i<row;i++)
                  
            {
                      
            for(int j=0;j<col;j++)
                          cout
            <<map[i][j];
                      cout
            <<endl;
                  }

            }

            //比較兩個(gè)節(jié)點(diǎn)位置是否相同
            bool AStar::equal_node( Node *node1, Node *node2)
            {
                
            if(node1->x==node2->x&&
                    node1
            ->y==node2->y)
                    
            return true;
                
            return false;
            }


            //開(kāi)始搜索*
            void AStar::Search()
            {
                vec_begin.push_back(
            &start);
                
            while(!vec_begin.empty())
                
            {
                    
            if(vec_begin.size()==1&&equal_node(vec_begin[0],&end))
                        
            break;
                    
            //取出第一個(gè)不是目標(biāo)位置
                    Node *node;
                    
            int pos=0;
                    
            do
                    
            {
                        node
            =vec_begin[pos];
                        pos
            ++;
                    }
            while(equal_node(node,&end));
                    

                    Node 
            *temp_node;
                    
            int m,n;
                    
            //向右
                    m=node->x;
                    n
            =node->y+1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+10,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //右下
                    m=node->x+1;
                    n
            =node->y+1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+14,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //向下
                    m=node->x+1;
                    n
            =node->y;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+10,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //左下
                    m=node->x+1;
                    n
            =node->y-1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+14,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //向左
                    m=node->x;
                    n
            =node->y-1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+10,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //左上
                    m=node->x-1;
                    n
            =node->y-1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+14,node);
                        vec_begin.push_back(temp_node);
                    }


                    
            //向上
                    m=node->x-1;
                    n
            =node->y;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+10,node);
                        vec_begin.push_back(temp_node);
                    }

                    
            //右上
                    m=node->x-1;
                    n
            =node->y+1;
                    
            if(InMap(m,n)&&!InClosed(m,n))
                    
            {
                        temp_node
            =new Node(m,n,node->value+14,node);
                        vec_begin.push_back(temp_node);
                    }


                    
            //將該位置加入closed
                    vec_closed.push_back(node);
                    vec_begin.erase(vec_begin.begin()
            +pos-1);

                    
            //重新將begin隊(duì)列排序,重復(fù)取value小的
                    Sort();

                    cout
            <<"----------------------begin------------------------------"<<endl;
                    put_vector(vec_begin);
                    cout
            <<"----------------------closed-----------------------------"<<endl;
                    put_vector(vec_closed);
                    
            //system("pause");
                }

                
            if(vec_begin.size()==1)
                
            {
                    cout
            <<"output the path:"<<endl;
                    Node
            * temp=vec_begin[0];
                    
            while(temp!=0)
                    
            {
                        cout
            <<temp->x<<"  "<<temp->y<<endl; 
                        temp
            =temp->parent;
                    }
                                  
                }

            }

            void AStar::put_vector(vector<Node *> &vect)
            {
                
                
            for(int i=0;i<vect.size();i++)
                    cout
            <<vect[i]<<" :  "<<vect[i]->x<<"    "<<vect[i]->y<<"    "<<vect[i]->value<<"    parent:"<<vect[i]->parent<<endl;
            }

            //在地圖上該位置是否合法(不可到達(dá)位置)
            bool AStar::InMap(int x,int y)
            {
                
            if(x>=row||x<0return false;
                
            if(y>=col||y<0return false;

                
            if(map[x][y]=='1') return false;

                
            return true;
            }

            //是否在關(guān)閉隊(duì)列:已經(jīng)搜索過(guò)的位置放入關(guān)閉隊(duì)列
            bool AStar::InClosed(int x,int y)
            {
                
            for(int i=0;i<vec_closed.size();i++)
                
            {
                    
            if(vec_closed[i]->x==x&&vec_closed[i]->y==y)
                        
            return true;
                }

                
            return false;
            }


            void AStar::Sort()
            {
                ::sort(vec_begin.begin(),vec_begin.end(),sort_node);
                nodeiter::iterator iter,iter2;;
                iter
            =vec_begin.begin()+1;
                
                
            while(iter!=vec_begin.end())
                
            {
                    iter2
            =vec_begin.begin();
                     
            while(iter2!=iter)
                    
            {
                        
            if((*iter)->x==(*iter2)->x&&(*iter)->y==(*iter2)->y)
                        
            {
                           
            //cout<<"                                                  ======0"<<endl;
                           iter2=iter-1;
                           
            delete *iter;
                           vec_begin.erase(iter);
                           iter
            =iter2;
                           
            break;
                        }

                        iter2
            ++;
                    }

                   
                    iter
            ++;
                }

            }

               AStar.h
            /*
            ** Auther:cjz
            ** Date: 2008/01/14
            ** Description:A*尋路算法
            */

            #pragma once
            #include 
            <algorithm>

            #include 
            <vector>
            #include 
            <fstream>
            using namespace std;

            #define MAX_COL 
            50
            struct Node
            {

                
                
            int x;
                
            int y;
                
            int value;
                Node 
            * parent;
                
                Node(
            int _x=0,int _y=0,int _value=0,Node * _parent=0)
                
            {
                    x
            =_x;
                    y
            =_y;
                    value
            =_value;
                    parent
            =_parent;
                }

            }
            ;


            class AStar
            {
            public:
                AStar(
            void);
                
            ~AStar(void);

                
            void Initalize(char * mapfile);
                
            //開(kāi)始尋路
                void Search();
                
            private:
                bool equal_node( Node 
            *node1, Node *node2);
                bool InMap(
            int x,int y );
                bool InClosed(
            int x,int y);
                
            void Sort();
                
            void put_vector(vector<Node*> &);

            private:
                
            char map[MAX_COL][MAX_COL];
                
            int row,col;
                vector
            <Node *> vec_begin,vec_closed;
                typedef vector
            <Node *>  nodeiter;
            public:
                
                Node start,end;
            }
            ;

            用法:
               
            #include "AStar.h"


            int _tmain(int argc, _TCHAR* argv[])
            {
                

                
                AStar star;
                star.Initalize(
            "c:\\a.txt");

                cout
            <<"input start pos(x,y):";
                
            int x,y;
                scanf(
            "%d,%d",&x,&y);
                star.start
            =Node(x,y);
                cout
            <<"input end   pos(x,y):";
                scanf(
            "%d,%d",&x,&y);
                star.end
            =Node(x,y);

                star.Search();



                system(
            "pause");
                
            return 0;
            }

            posted on 2008-01-14 22:18 飛天 閱讀(568) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 算法描述

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久综合香蕉国产蜜臀AV| 中文字幕人妻色偷偷久久| 国产欧美久久久精品| 久久99国产综合精品| 伊人久久综合成人网| 国内精品久久久久久99| 色成年激情久久综合| 久久噜噜久久久精品66| 久久久久久久久66精品片| 久久亚洲精品中文字幕| 国内精品久久久久国产盗摄| 99精品久久精品一区二区| 无码专区久久综合久中文字幕 | 久久亚洲国产成人影院网站| 中文字幕无码精品亚洲资源网久久| 精品一区二区久久久久久久网站| 亚洲第一永久AV网站久久精品男人的天堂AV | 99久久精品免费看国产一区二区三区 | 俺来也俺去啦久久综合网| 久久国产热这里只有精品| 日韩人妻无码精品久久免费一| 久久久中文字幕| 蜜臀av性久久久久蜜臀aⅴ麻豆| 国产精品免费福利久久| 国产精品伦理久久久久久| 久久精品国产亚洲AV无码麻豆| 国产女人aaa级久久久级| 一本一本久久a久久精品综合麻豆| 久久精品麻豆日日躁夜夜躁| 久久久久久久精品成人热色戒| 久久精品成人欧美大片| 久久国产精品成人免费| 色欲综合久久中文字幕网| 一本一本久久aa综合精品| 久久久国产精品| 久久精品国产清自在天天线| 国产精品一区二区久久| 精品久久久噜噜噜久久久| 久久人妻少妇嫩草AV蜜桃| 亚洲欧洲精品成人久久奇米网| 午夜精品久久久久久|