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

            飛天

            快樂的生活......

             

            我的A*尋路算法

                   關于A*算法,可以參考:http://data.gameres.com/message.asp?TopicID=25439
                   以下是實現的代碼。
            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);
            }

            //重新排列開始隊列
            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];

            }


            //轉入地圖文件初始化數組
            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;
                  }

            }

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


            //開始搜索*
            void AStar::Search()
            {
                vec_begin.push_back(
            &start);
                
            while(!vec_begin.empty())
                
            {
                    
            if(vec_begin.size()==1&&equal_node(vec_begin[0],&end))
                        
            break;
                    
            //取出第一個不是目標位置
                    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隊列排序,重復取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;
            }

            //在地圖上該位置是否合法(不可到達位置)
            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;
            }

            //是否在關閉隊列:已經搜索過的位置放入關閉隊列
            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);
                
            //開始尋路
                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 飛天 閱讀(565) 評論(0)  編輯 收藏 引用 所屬分類: 算法描述

            導航

            統計

            常用鏈接

            留言簿(2)

            隨筆分類

            隨筆檔案

            文章分類

            文章檔案

            Blogs

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久久久久搜索| 久久综合久久综合九色| 久久精品亚洲日本波多野结衣| 国产精品美女久久久久| 一本色道久久综合狠狠躁篇| 久久久WWW成人| 秋霞久久国产精品电影院| 久久不见久久见免费视频7| 国产高清国内精品福利99久久| 久久午夜羞羞影院免费观看| 2019久久久高清456| 亚洲人成无码久久电影网站| 九九久久精品无码专区| 日本福利片国产午夜久久| 好久久免费视频高清| 狠狠久久综合伊人不卡| 中文字幕精品无码久久久久久3D日动漫 | 国产精品女同久久久久电影院| 亚洲人AV永久一区二区三区久久| 久久99精品久久久久久不卡| 久久国产精品99久久久久久老狼| 性做久久久久久久| 久久人人妻人人爽人人爽| 久久精品99久久香蕉国产色戒| 99久久中文字幕| 国产成人久久精品激情 | 潮喷大喷水系列无码久久精品| 国产精品久久久久久久久| 久久国产精品99国产精| 久久93精品国产91久久综合| 伊人久久大香线蕉无码麻豆| 99久久无色码中文字幕人妻| 国产综合久久久久| 国产精品免费久久久久久久久| 思思久久99热只有频精品66| 无码精品久久久久久人妻中字| 国产欧美久久久精品| 久久艹国产| 国产人久久人人人人爽| 日本精品久久久久影院日本| 亚洲精品无码久久千人斩|