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

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

?? maze.~cpp

?? 用C++BUILDER做的一個迷宮,可以實現(xiàn)深度優(yōu)先,廣度優(yōu)先和啟發(fā)式搜索算法
?? ~CPP
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <vector>
#include <algorithm>
#pragma hdrstop

#include <cstdlib>
#include <ctime>
#include "Maze.h"
using namespace std;
//----------------------------
bool Node::operator<(const Node & m) const
{
        return cost<m.cost;
}
//--------------------------------
Maze::Maze()
{
      num=4;
      HEIGHT_MAX=400;
      WIDTH_MAX=600;
      ReDraw=false;
}
//-------------------------------
Maze::~Maze()
{

}
//----------------------------------------------------
void Maze::Destroy()
{
   if(!open.empty())
         {
            for(ptr=open.begin();!open.end();ptr++)
               delete ptr->adr;
         }
   if(!closed.empty())
         {
            for(ptr=closed.begin();!closed.end();ptr++)
               delete ptr->adr;
         }
}
//---------------------------------------------------------------------------
void Maze::CreateMaze(int &x,int &y,TForm * f)
{
   ShpHeight=HEIGHT_MAX/x;//shape高
   ShpWidth=WIDTH_MAX/y;//shape寬
   for(int i=0;i<x;i++)
      for(int j=0;j<y;j++)
      {
      Shp[i][j]=new TShape(f);
      Shp[i][j]->Parent=f;
      Shp[i][j]->Width=ShpWidth;
      Shp[i][j]->Height=ShpHeight;
      Shp[i][j]->Top+=4+i*ShpHeight;
      Shp[i][j]->Left+=4+j*ShpWidth;
      Shp[i][j]->Shape=stRectangle;
      Shp[i][j]->Pen->Color=clWhite;
      }
}
//---------------------------------------
void Maze::MakeMaze(int &x,int &y,float &bili)
{
   srand((unsigned)time(NULL));
      //動態(tài)分配2維數(shù)組
      Maze=new int* [x];
      for(int i=0;i<x;i++)
      Maze[i]=new int[y];

      for(int i=0;i<x;i++)
         for(int j=0;j<y;j++)
         {
              Maze[i][j]=1;
         }
     for(int i=1;i<x-1;i++)
         for(int j=1;j<y-1;j++)
         {
               Shp[i][j]->Brush->Color=clWhite;
               Shp[i][j]->Shape=stRectangle;
         }
       for(int i=1;i<x-1;i++)
         for(int j=1;j<y-1;j++)
         {
             Maze[i][j]=rand()%100;
             if(Maze[i][j]<100*bili)
             Maze[i][j]=1;
             else
             Maze[i][j]=0;
         }
         Maze[1][0]=0;//
         Maze[x-2][y-1]=0;
       for(int i=0;i<x;i++)
         for(int j=0;j<y;j++)
            {
               if(Maze[i][j]==1)
               Shp[i][j]->Brush->Color=clBlue;
               Shp[i][j]->Shape=stRectangle;
            }
       for(int i=0;i<x;i++)
         for(int j=0;j<y;j++)
         {
            if(i==0||i==x-1||j==0||j==y-1)
               {
                  Shp[i][j]->Brush->Color=clBlack;
                  Shp[i][j]->Pen->Color=clBlack;
               }
         }
         //出入口顏色
         Shp[1][0]->Brush->Color=clWhite;
         Shp[1][0]->Pen->Color=clWhite;
         Shp[x-2][y-1]->Brush->Color=clWhite;
         Shp[x-2][y-1]->Pen->Color=clWhite;
         ReDraw=false;
}
//------------------------------
void Maze::SearchRoad(int &x,int &y,int gd,int sd,int ax)
{
   int k=0;//擴展結點數(shù)
   int count=0;//代價總數(shù)
   int x0=1;
   int y0=1;
   int dir0=0;
   vector <Node>::iterator ptr;//用于存放Open表中的首結點迭代器
   Node offset[4];//各個方向的步進
   offset[0].x=0;offset[0].y=1;
   offset[1].x=1;offset[1].y=0;
   offset[2].x=0;offset[2].y=-1;
   offset[3].x=-1;offset[3].y=0;
   if(ReDraw)//對數(shù)組重置
   {
   for(int i=1;i<x-1;i++)
      for(int j=1;j<y-1;j++)
      {
         if(Maze[i][j]==-1)
         {
            Shp[i][j]->Brush->Color=clWhite;
            Shp[i][j]->Shape=stRectangle;
            Maze[i][j]=0;
         }
      }
   }
 if(gd)//廣度優(yōu)先
 {
   Node * node=new Node();
   node->adr=node;
   open.push_back(*node);
   Node * front=node;//存放首結點
   while(true)
   {
      if(open.size()==0)
      {
         Destroy();//如無發(fā)現(xiàn)通路則將擴展結點刪除
         ShowMessage("該迷宮無通路");
         return;
      }
      ptr=open.begin();//存放open表的首結點迭代器
      front=ptr->adr;//存放該結點的地址
      closed.push_back(*ptr);//將待擴展結點放入closed表
      open.erase(open.begin(),open.begin()+1);//將open表的首結點刪除
      //判斷是否找到出口
      if(front->x==x-2 && front->y==y-2)
      {
         while(front->x!=1||front->y!=1)
         {
            count+=front->cost;
            x0=front->x;
            y0=front->y;
            front=front->pre;//
            Shp[x0][y0]->Brush->Color=clLime;//走過的路徑用綠色表示
            Shp[x0][y0]->Shape=stEllipse;
            if(front->x==1&&front->y==1)
            {
               count+=front->cost;
               x0=front->x;
               y0=front->y;
               Shp[x0][y0]->Brush->Color=clLime;
               Shp[x0][y0]->Shape=stEllipse;
               break;//找到初始結點后則跳出循環(huán)
            }
         }
         //刪除容器中結點
         Destroy();
         open.erase(open.begin(),open.end());
         closed.erase(closed.begin(),closed.end());
         ReDraw=true;
         ShowMessage("擴展的結點數(shù)"+IntToStr(k)+",代價為"+IntToStr(count));
         return;
      }
      //判斷結點是否可擴展
      x0=front->x;
      y0=front->y;
      //判斷四個方向是否可擴展
      if(Maze[x0][y0+1]!=0&&Maze[x0+1][y0]!=0&&Maze[x0-1][y0]!=0&&Maze[x0][y0-1]!=0)
         continue;
      Maze[x0][y0]=-1;//標識為已擴展
      for(int i=0;i<num;i++)
      {

         x0=front->x+offset[i].x;//擴展結點坐標
         y0=front->y+offset[i].y;
         if(Maze[x0][y0]==0)
         {
            Node * node=new Node();
            node->dir=i;
            node->x=x0;
            node->y=y0;
            node->adr=node;
            node->pre=front;
            k++;
            if(front->dir==i)
               node->cost=front->cost+2;
            else
               node->cost=front->cost+3;
            open.push_back(*node);
         }
      }
      sort(open.begin(),open.end());//對open表進行排序
   }
 }//end of if(gd)
  if(sd)//深度優(yōu)先
  {
   int n;//擴展結點數(shù)
   Node * node=new Node();
   node->adr=node;
   open.push_back(*node);
   Node * front=node;//存放首結點
   while(true)
   {
      if(open.size()==0)
      {
         Destroy();
         ShowMessage("該迷宮無通路");
         return;
      }
      ptr=open.begin();//存放open表的首結點迭代器
      front=ptr->adr;//存放該結點的地址
      closed.push_back(*ptr);//將待擴展結點放入closed表
      open.erase(open.begin(),open.begin()+1);//將open表的首結點刪除
      if(front->x==x-2 && front->y==y-2) //判斷是否找到出口
      {
         while(front->x!=1||front->y!=1)
         {
            count+=front->cost;
            x0=front->x;
            y0=front->y;
            front=front->pre;//
            Shp[x0][y0]->Brush->Color=clLime;//走過的路徑用綠色表示
            Shp[x0][y0]->Shape=stEllipse;
            if(front->x==1&&front->y==1)
            {
               count+=front->cost;
               x0=front->x;
               y0=front->y;
               Shp[x0][y0]->Brush->Color=clLime;
               Shp[x0][y0]->Shape=stEllipse;
               break;//找到初始結點后則跳出循環(huán)
            }
         }
         //刪除容器中結點
         Destroy();
         open.erase(open.begin(),open.end());
         closed.erase(closed.begin(),closed.end());
         ReDraw=true;
         //Application->MessageBoxA("說明","共擴展結點"+k,MB_OK);
         ShowMessage("擴展的結點數(shù)"+IntToStr(k)+",代價為"+IntToStr(count));
         return;
      }
      //判斷結點是否可擴展
      x0=front->x;
      y0=front->y;
      //判斷四個方向是否可擴展
      if(Maze[x0][y0+1]!=0&&Maze[x0+1][y0]!=0&&Maze[x0-1][y0]!=0&&Maze[x0][y0-1]!=0)
         continue;
      Maze[x0][y0]=-1;//標識為已擴展
      n=0;//將上次擴展結點數(shù)清0
      for(int i=0;i<num;i++)
      {
         x0=front->x+offset[i].x;//擴展結點坐標
         y0=front->y+offset[i].y;
         if(Maze[x0][y0]==0)//為0則可擴展
         {
            Node * node=new Node();
            node->dir=i;
            node->x=x0;
            node->y=y0;
            node->adr=node;
            node->pre=front;
            n++;//將結點加1
            k++;
            if(front->dir==i)
               node->g=front->g+2;
            else
               node->g=front->g+3;
               node->h=(x-2)-x0+(y-2)-y0;
               node->cost=node->g+0.2*node->h;
               open.insert(open.begin(),*node);//將擴展結點從頭插入
         }
      }
      sort(open.begin(),open.begin()+n);//對剛插入的結點進行排序
   }
  }//end of if(sd)
  if(ax)//A*算法
  {
         Node * node=new Node();
   node->adr=node;
   open.push_back(*node);
   Node * front=node;//存放首結點
   while(true)
   {
      if(open.size()==0)
      {
         Destroy();
         ShowMessage("該迷宮無通路");
         return;
      }
      ptr=open.begin();//存放open表的首結點迭代器
      front=ptr->adr;//存放該結點的地址
      closed.push_back(*ptr);//將待擴展結點放入closed表
      open.erase(open.begin(),open.begin()+1);//將open表的首結點刪除
      //判斷是否找到出口
      if(front->x==x-2 && front->y==y-2)
      {
         while(front->x!=1||front->y!=1)
         {
            count+=front->cost;
            x0=front->x;
            y0=front->y;
            front=front->pre;//
            Shp[x0][y0]->Brush->Color=clLime;//走過的路徑用綠色表示
            Shp[x0][y0]->Shape=stEllipse;
            if(front->x==1&&front->y==1)
            {
               count+=front->cost;
               x0=front->x;
               y0=front->y;
               Shp[x0][y0]->Brush->Color=clLime;
               Shp[x0][y0]->Shape=stEllipse;
               break;//找到初始結點后則跳出循環(huán)
            }
         }
         //刪除容器中結點
         if(!open.empty())
         {
            for(ptr=open.begin();!open.end();ptr++)
               delete ptr->adr;
         }
         if(!closed.empty())
         {
            for(ptr=closed.begin();!closed.end();ptr++)
               delete ptr->adr;
         }
         Destroy();
         open.erase(open.begin(),open.end());
         closed.erase(closed.begin(),closed.end());
         ReDraw=true;
         //Application->MessageBoxA("說明","共擴展結點"+k,MB_OK);
         ShowMessage("擴展的結點數(shù)"+IntToStr(k)+",代價為"+IntToStr(count));
         return;
      }
      //判斷結點是否可擴展
      x0=front->x;
      y0=front->y;
      //判斷四個方向是否可擴展
      if(Maze[x0][y0+1]!=0&&Maze[x0+1][y0]!=0&&Maze[x0-1][y0]!=0&&Maze[x0][y0-1]!=0)
         continue;
      Maze[x0][y0]=-1;//標識為已擴展
      for(int i=0;i<num;i++)
      {
         x0=front->x+offset[i].x;//擴展結點坐標
         y0=front->y+offset[i].y;
         if(Maze[x0][y0]==0)
         {
            Node * node=new Node();
            node->dir=i;
            node->x=x0;
            node->y=y0;
            node->adr=node;
            node->pre=front;
            k++;
            if(front->dir==i)
               node->g=front->g+2;
            else
               node->g=front->g+3;
            node->h=(x-2)-x0+(y-2)-y0;//啟發(fā)式函數(shù)
            node->cost=node->g+3*node->h;
            open.push_back(*node);
         }
      }
      sort(open.begin(),open.end());//對open表進行排序
   }//end of if(ax)
  }
}
//--------------------------------
void Maze::DeleteShp(int &x,int &y)
{
   for(int i=0;i<x;i++)
    {
      for(int j=0;j<y;j++)
      {
         delete Shp[i][j];
      }
    }
    for(int i=0;i<x;i++)
    {
      delete [y]Maze[i];
    }
      delete [x]Maze;
}
//-----------------------------------
#pragma package(smart_init)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩成人在线一区| 日韩美女天天操| 日韩一区二区免费在线电影 | 国产精品美女www爽爽爽| 亚洲啪啪综合av一区二区三区| 日韩专区中文字幕一区二区| 国产乱码精品1区2区3区| 欧美亚洲高清一区二区三区不卡| 精品国产伦理网| 亚洲v中文字幕| aaa国产一区| 亚洲精品在线三区| 日韩成人免费电影| 一本到高清视频免费精品| 国产亚洲一区二区三区在线观看 | 6080日韩午夜伦伦午夜伦| 国产精品视频九色porn| 久久av老司机精品网站导航| 欧美日韩一区视频| 一区二区三区在线视频观看| 99视频一区二区三区| 国产午夜一区二区三区| 久久国产人妖系列| 欧美一区二区精品在线| 五月婷婷另类国产| 欧美视频一区在线观看| 亚洲国产精品一区二区久久 | 亚洲午夜免费电影| 91色在线porny| 亚洲丝袜自拍清纯另类| av电影在线观看完整版一区二区| 国产精品私人影院| 成人国产一区二区三区精品| 中文字幕日韩av资源站| 99精品欧美一区二区蜜桃免费| 国产精品网友自拍| 一本大道久久a久久综合| 亚洲欧美一区二区不卡| 在线免费观看一区| 亚洲午夜激情av| 91精品国产综合久久精品app| 亚洲成av人片在线| 制服丝袜激情欧洲亚洲| 另类小说色综合网站| 久久久噜噜噜久噜久久综合| 国产精品自产自拍| 国产精品久久久久久妇女6080 | 欧美精品国产精品| 日本视频免费一区| 精品久久国产老人久久综合| 国产一区在线看| 国产精品理论在线观看| 91精品蜜臀在线一区尤物| 久久成人免费网| 日本一区二区成人| 91国偷自产一区二区使用方法| 五月天激情综合| 久久久噜噜噜久噜久久综合| 972aa.com艺术欧美| 视频一区国产视频| 国产欧美一区二区精品忘忧草| thepron国产精品| 午夜视频在线观看一区二区三区| 日韩欧美精品在线| aaa国产一区| 免费高清在线一区| 国产精品久久久久婷婷| 欧美亚洲国产一区二区三区 | a级精品国产片在线观看| 亚洲国产精品欧美一二99| 精品国产成人系列| 一本一道综合狠狠老| 麻豆传媒一区二区三区| 中文字幕中文在线不卡住| 欧美一区二区三区免费观看视频| 国产精品亚洲一区二区三区在线| 亚洲国产你懂的| 国产精品国产a级| 欧美一级生活片| 91国产免费观看| 国产成人亚洲精品青草天美| 五月天激情综合网| 亚洲日本丝袜连裤袜办公室| 日韩一区二区精品| 色999日韩国产欧美一区二区| 国产一区二区成人久久免费影院| 亚洲午夜电影网| 国产精品国产自产拍高清av王其| 日韩一二三区视频| 欧日韩精品视频| 成人教育av在线| 激情图片小说一区| 日韩电影在线一区| 亚洲午夜久久久久久久久电影网| 国产精品久久久一本精品| 精品国产91洋老外米糕| 欧美日韩国产成人在线免费| 972aa.com艺术欧美| 国产精品资源在线| 精品一区精品二区高清| 欧美96一区二区免费视频| 亚洲午夜私人影院| 亚洲免费大片在线观看| 国产精品欧美一区喷水| 久久久久久久久久久99999| 日韩欧美国产综合在线一区二区三区 | 成人激情动漫在线观看| 国产一区二区视频在线播放| 日本欧美一区二区在线观看| 午夜精品福利久久久| 亚洲午夜私人影院| 亚洲成人综合在线| 亚洲va欧美va天堂v国产综合| 国内精品嫩模私拍在线| 蜜桃视频一区二区三区在线观看| 无码av免费一区二区三区试看| 一级特黄大欧美久久久| 一区二区三区四区激情| 一区二区三区四区蜜桃| 亚洲一区二区欧美日韩| 亚洲成人av电影| 日韩国产欧美三级| 精品一区中文字幕| 丁香六月久久综合狠狠色| 99精品久久只有精品| 欧美亚日韩国产aⅴ精品中极品| 一本大道av一区二区在线播放| 91福利视频久久久久| 欧美一区二区在线视频| 日韩女优av电影在线观看| 久久综合九色综合久久久精品综合| 精品99久久久久久| 欧美国产欧美综合| 亚洲欧美日韩在线| 一区二区激情视频| 日韩av一区二区在线影视| 麻豆91精品视频| 国产mv日韩mv欧美| 91黄色免费看| 日韩免费看的电影| 亚洲国产经典视频| 亚洲伊人伊色伊影伊综合网| 日本免费新一区视频| 国产精品主播直播| 欧美在线观看18| 精品国产乱码91久久久久久网站| 中文字幕av一区二区三区免费看| **欧美大码日韩| 免费看欧美女人艹b| 波多野结衣亚洲| 欧美日本精品一区二区三区| 久久久美女毛片| 亚洲一区二区三区爽爽爽爽爽 | 天天射综合影视| 国产aⅴ精品一区二区三区色成熟| 91网址在线看| 欧美成人官网二区| 亚洲卡通欧美制服中文| 麻豆国产一区二区| 色综合久久久久久久久| 精品国内片67194| 亚洲女同一区二区| 国内成+人亚洲+欧美+综合在线| 93久久精品日日躁夜夜躁欧美| 欧美一区二区久久久| 亚洲乱码一区二区三区在线观看| 日本不卡一区二区三区 | 狠狠色丁香久久婷婷综合_中| 91色视频在线| 久久精品视频免费观看| 午夜精品在线看| 99久久综合色| 精品国产一区久久| 午夜久久久久久电影| 99国内精品久久| 久久综合九色综合97婷婷女人 | 一区二区三区在线视频免费| 国产激情视频一区二区三区欧美 | 国内外成人在线| 欧美老女人在线| 国产精品国产三级国产专播品爱网| 韩国视频一区二区| 91精品视频网| 亚洲一区免费视频| 91网上在线视频| 国产午夜亚洲精品羞羞网站| 日本美女一区二区三区| 欧美视频一区二区三区| 亚洲男人的天堂网| 不卡一二三区首页| 国产精品麻豆久久久| 国产福利一区在线| 精品国产乱码久久| 狠狠色丁香九九婷婷综合五月| 欧美一级一区二区| 麻豆一区二区在线| 欧美tickling挠脚心丨vk| 美女脱光内衣内裤视频久久网站| 欧美精品色一区二区三区| 亚洲成人午夜影院|