【隊列應用一】隨機迷宮|隨機起點終點*最短路徑演算法

来源:http://www.cnblogs.com/tenderwx/archive/2016/03/26/5321926.html
-Advertisement-
Play Games

l 時間為種子。白色格子10%概率生成。綠色和紅色子塊的坐標隨機生成。 srand((unsigned)time(NULL)); //以時間為隨機種子 for(i=1;i<=size;i++) { for(j=1;j<=size;j++) { if(1==rand()%10) //10%摡率達成 g ...


  1 #include<iostream>
  2 #include<queue>
  3 #include<windows.h>
  4 #include<time.h>
  5 using namespace std;
  6 struct position     //位置
  7 {
  8     int row;
  9     int col;
 10 };
 11 void display(int size,int **grid);
 12 
 13 int main()
 14 {
 15 
 16 /*****************************產生隨機MAZE,並顯示************************************/
 17     int size,i,j,p,q,m,n;
 18     int **grid;
 19     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|
 20     FOREGROUND_GREEN|FOREGROUND_BLUE);//白色
 21     cout<<"please enter the size(邊長)of square!(size<100)"<<endl;
 22     cin>>size;
 23     grid=new int *[size+2];      //動態創建二維數組
 24     for(i=0;i<size+2;i++)
 25         {
 26             grid[i] = new int[size+2];        //這個指針數組的每個指針元素又指向一個數組。
 27         }
 28     for(i=0;i<size+2;i++)
 29         {
 30             grid[i][0]='y';grid[0][i]='y';
 31             grid[size+1][i]='y';grid[i][size+1]='y';
 32         }
 33     srand((unsigned)time(NULL));     //以時間為隨機種子
 34     for(i=1;i<=size;i++)
 35     {
 36         for(j=1;j<=size;j++)
 37         {
 38             
 39             if(1==rand()%10)     //10%摡率達成
 40                grid[i][j]='y';
 41             else
 42                 grid[i][j]=0;
 43             }
 44     }
 45             p=rand()%size+1;
 46             q=rand()%size+1;     //隨機起點、終點
 47             grid[p][q]='g';
 48             m=rand()%size+1;
 49             n=rand()%size+1;
 50             grid[m][n]='r';
 51 
 52    display(size,grid);
 53 /**********************************找路********************************
 54    把nbr都壓入queue,一個一個彈出在找一下nbr,再壓入,直到終點**********************/
 55      position offset[4];   //方向
 56      offset[0].row=1;offset[0].col=0;//right
 57      offset[1].row=0;offset[1].col=-1;//down
 58      offset[2].row=-1;offset[2].col=0;//left
 59      offset[3].row=0;offset[3].col=1;//up
 60       
 61      position here;
 62      position nbr;    
 63      position finish;
 64      queue<position> Q;
 65 
 66      //初始化
 67      here.row=p;here.col=q;
 68      finish.row=m;finish.col=n;
 69      grid[here.row][here.col]=0;
 70      while(true){
 71      for(i=0;i<4;i++)
 72      {
 73          nbr.row=here.row+offset[i].row;
 74          nbr.col=here.col+offset[i].col; 
 75          if((nbr.row==finish.row)&&(nbr.col==finish.col))
 76          { grid[finish.row][finish.col]=grid[here.row][here.col]+1;
 77              break;
 78          }
 79          else if(grid[nbr.row][nbr.col]==0)
 80          {grid[nbr.row][nbr.col]=grid[here.row][here.col]+1;
 81          Q.push(nbr);}                     //符合條件的nbr都壓進去
 82         
 83      }
 84      if((nbr.row==finish.row)&&(nbr.col==finish.col))
 85      { grid[finish.row][finish.col]=grid[here.row][here.col]+1;
 86          break;
 87      }
 88      if(Q.empty())
 89      {
 90          cout<<"no path!"<<endl;
 91          break;
 92      }
 93      here=Q.front();       //取出front
 94      Q.pop();
 95      
 96      };
 97 /****************************建造最短路徑****************
 98      從終點往回看,每次迴圈都看和終點計數的差值****************/
 99     here=finish;
100     int length=grid[finish.row][finish.col];
101 for(j=1;j<length;j++)
102 {
103     for(i=0;i<4;i++)
104     {
105         nbr.row=here.row+offset[i].row;
106         nbr.col=here.col+offset[i].col;
107         if(grid[nbr.row][nbr.col]==(grid[finish.row][finish.col]-j))
108         {
109             grid[nbr.row][nbr.col]='p';               //你都把值改了下一迴圈成了p-1
110             here=nbr;
111             break;
112         }
113     }    
114 }
115 /**********************display**********************************/
116 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |BACKGROUND_RED|
117             BACKGROUND_GREEN | BACKGROUND_BLUE);//白色
118        cout<<"Show you the shortest path!"<<endl;
119        grid[p][q]='g';
120        grid[m][n]='r';
121    display(size,grid);    
122 return 0;
123 }
124 
125 /*********************顯示函數***************************************/
126 void display(int size,int **grid)
127 {      int i,j;
128           for(i=0;i<size+2;i++)
129     {
130         for(j=0;j<size+2;j++)
131         {
132             if(grid[i][j]=='y') 
133             {
134                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|
135                 BACKGROUND_GREEN);//黃色
136                cout<<' '<<' ';
137             }
138             
139             else if(grid[i][j]=='g')
140             {
141                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
142                 BACKGROUND_GREEN);   //綠色
143                 cout<<' '<<' ';
144             }
145             else if(grid[i][j]=='r')
146             {
147                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
148                 BACKGROUND_RED);   //紅色
149                 cout<<' '<<' ';
150             }
151             else if(grid[i][j]=='p')
152             {
153                 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |
154             BACKGROUND_GREEN | BACKGROUND_BLUE);
155                 cout<<' '<<' ';
156             }
157             else
158             {    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY |BACKGROUND_RED|
159             BACKGROUND_GREEN | BACKGROUND_BLUE);//白色
160             cout<<' '<<' ';
161             }
162     
163         }
164         cout<<endl;
165     }
166 }

 

l  時間為種子。白色格子10%概率生成。綠色和紅色子塊的坐標隨機生成。

       srand((unsigned)time(NULL));     //以時間為隨機種子

    for(i=1;i<=size;i++)

       {

              for(j=1;j<=size;j++)

              {

                    

                     if(1==rand()%10)     //10%摡率達成

                        grid[i][j]='y';

                     else

                            grid[i][j]=0;

                     }

       }

                     p=rand()%size+1;

                     q=rand()%size+1;     //隨機起點、終點

                     grid[p][q]='g';        //綠色

            m=rand()%size+1;

            n=rand()%size+1;

                     grid[m][n]='r';       //紅色

l  Queue:把符合條件的nbr都壓入隊列,每次彈出一個作為新的here再尋找nbr,直到找到終點。同時如果隊列為空,輸出no path!並跳出。(具體見程式)

l  顏色設置利用windos.h頭文件中的函數,設置了方塊背景色。見另隨筆。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Git簡介 1.Git是什麼 Git是分散式版本控制系統 2.Git有什麼特點 (1)Git是分散式的SCM,SVN是集中式的 (2)Git每個歷史版本存儲完整的文件,SVN存儲文件差異 (3)Git可離線完成大部分操作,SVN則相反 (4)Git有著更優雅的分支和合併實現 (5)Git有著更強... ...
  • 學習如何在MVC項目中配置AutoMapper。 一:首先在MVC項目中引用AutoMapper的DLL文件,接著創建一個介面,這裡面我們需要定義兩個方法,介面裡面的方法只能定義不能實現,也沒有什麼修飾符,實現介面的類必須實現裡面全部的方法。 定義介面IStartupTask,裡面有兩個方法。 pu... ...
  • 一、開發環境 編譯器:VS2013 .Net版本:4.5 二、開發過程 1.畫一條直線 private void btnDrawLine_Click(object sender, EventArgs e) { //創建一個畫圖圖面 Graphics g = this.CreateGraphics()... ...
  • 由於項目升級到了.NetFramework 4.6.1,開發工具轉向了vs2015,趁機嘗試下C#6.0.結果在網上搜的一些教程總結的不是太完整,有的代碼隨著vs正式版的發佈也有所修改.那些個教程也沒更新.所以把自己學習到的記錄一下. 1.自動屬性初始化(Auto-property initiali ...
  • 生日悖論,指如果一個房間里有23個或23個以上的人,那麼至少有兩個人的生日相同的概率要大於50%,準確的說是50.7左右,這就意味著在一個典型的標準小學班級(30人)中,存在兩人生日相同的可能性更高。對於60或者更多的人,這種概率要大於99%。從引起邏輯矛盾的角度來說生日悖論並不是一種悖論,從這個數 ...
  • 使用spring的jdbcTemplate 使用具名參數 在JDBC用法中,SQL參數是用占位符?表示,並且受到位置的限制,定位參數的問題在於,一旦參數的位置發生變化,必須改變參數的綁定,在Spring JDBC中,綁定SQL參數的另一種選擇是使用具名參數,SQL具名參數是按照名稱綁定,而不是位置綁 ...
  • refresh用於刷新與跳轉(重定向)頁面 refresh出現在http-equiv屬性中,使用content屬性表示刷新或跳轉的開始時間與跳轉的網址 refresh示例 5秒之後刷新本頁面: <meta http-equiv="refresh" content="5"/> 5秒之後轉到夢之都首頁: ...
  • Spark作為分散式的大數據處理框架必然或涉及到大量的作業調度,如果能夠理解Spark中的調度對我們編寫或優化Spark程式都是有很大幫助的; 在Spark中存在 轉換操作(Transformation Operation) 與 行動操作(Action Operation) 兩種;而轉換操作只是會從 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...