程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 【隊列應用一】隨機迷宮|隨機起點終點*最短路徑算法,隊列最短

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

編輯:C++入門知識

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


  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頭文件中的函數,設置了方塊背景色。見另隨筆。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved