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