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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...