迷宫(深度搜索)

  1 #include"iostream"
  2 #include"windows.h"
  3 #include"time.h"
  4 using namespace std;
  5 
  6 //gotoxy() x是第x列,y是第y行
  7 void gotoxy(int x, int y) //goto语句  
  8 {  
  9     COORD pos;  
 10     pos.X = x;  
 11     pos.Y = y;  
 12     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);  
 13 }
 14 
 15 class Maze{
 16 private:
 17     char **map;
 18     char bg;
 19     char wall;
 20     char cat;
 21     int w;
 22     int h;
 23 public:
 24     Maze(int w,int h);            //创建迷宫
 25     void setPattern(char bg,char wall,char cat);        //设置图案
 26     void initialization(char bg,char wall);                //随机初始化迷宫
 27     void show();                                        //打印迷宫
 28 
 29     bool move(int x,int y);                                //寻找出口
 30 };
 31 
 32 int main(){
 33     const char bg = ' ';
 34     const char wall = '#';
 35     const char cat = '>';
 36     Maze m1(80,20);
 37     m1.setPattern(bg,wall,cat);
 38     m1.initialization(bg,wall);
 39     m1.show();
 40     system("pause");
 41     bool b = m1.move(0,0);
 42     gotoxy(0,21);
 43     if(b){
 44         cout<<"成功"<<endl;
 45     }
 46     else{
 47         cout<<"未走出迷宫"<<endl;
 48     }
 49     gotoxy(0,23);
 50     system("pause");
 51     return 0;
 52 }
 53 Maze::Maze(int w,int h){
 54     this->w = w;
 55     this->h = h;
 56     map = new char*[h];
 57     for(int i = 0;i < h;i++){
 58         map[i] = new char[w];
 59     }
 60     bg = ' ';
 61     wall = '#';
 62     cat = '+';
 63 }
 64 void Maze::setPattern(char bg,char wall,char cat){
 65     this->bg = bg;
 66     this->wall = wall;
 67     this->cat = cat;
 68 }
 69 void Maze::initialization(char bg,char wall){
 70     srand(time(NULL));
 71     for(int i = 0;i < h;i++){
 72         for(int j = 0;j < w;j++){
 73             if(i == 0||j == 0||i == h - 1||j == w  - 1){
 74                 map[i][j] = wall;
 75             }
 76             else{
 77                 map[i][j] = rand() % 4 == 0 ? wall : bg;
 78             }
 79         }
 80     }
 81     map[1][1] = bg;
 82     map[0][1] = bg;
 83     map[0][0] = bg;
 84     map[h - 1][w - 1] = bg;
 85     map[h - 1][w - 2] = bg;
 86 }
 87 void Maze::show(){
 88     for(int i = 0;i < h;i++){
 89         for(int j = 0;j < w;j++){
 90             cout<<map[i][j];
 91         }
 92         cout<<endl;
 93     }
 94 }
 95 bool Maze::move(int x,int y){
 96     if(x<0||y<0){        //x,y是否合法
 97         return false;
 98     }
 99     if(x == w - 1&&y == h - 1){            //到达终点返回true
100         return true;
101     }
102     //未到达终点
103     if(map[y][x] == bg){                //如果该点是可以走的
104         gotoxy(x,y);
105         cout<<cat;
106         Sleep(5);
107         map[y][x] = cat;                //每走一格就填充,否则会倒退死循环
108         //再走下一步
109         if(move(x + 1,y)||move(x,y + 1)||move(x,y - 1)||move(x - 1,y)){                            //如果到达了终点,直接返回true
110             return true;
111         }
112         //如果该点被走过但无法到达终点,标记为-
113         else{                                
114             gotoxy(x,y);
115             cout<<'-';
116         }
117     }
118     return false;
119 }#include"iostream"
120 #include"windows.h"
121 #include"time.h"
122 using namespace std;
123 
124 //gotoxy() x是第x列,y是第y行
125 void gotoxy(int x, int y) //goto语句  
126 {  
127     COORD pos;  
128     pos.X = x;  
129     pos.Y = y;  
130     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);  
131 }
132 
133 class Maze{
134 private:
135     char **map;
136     char bg;
137     char wall;
138     char cat;
139     int w;
140     int h;
141 public:
142     Maze(int w,int h);            //创建迷宫
143     void setPattern(char bg,char wall,char cat);        //设置图案
144     void initialization(char bg,char wall);                //随机初始化迷宫
145     void show();                                        //打印迷宫
146 
147     bool move(int x,int y);                                //寻找出口
148 };
149 
150 int main(){
151     const char bg = ' ';
152     const char wall = '#';
153     const char cat = '>';
154     Maze m1(80,20);
155     m1.setPattern(bg,wall,cat);
156     m1.initialization(bg,wall);
157     m1.show();
158     system("pause");
159     bool b = m1.move(0,0);
160     gotoxy(0,21);
161     if(b){
162         cout<<"成功"<<endl;
163     }
164     else{
165         cout<<"未走出迷宫"<<endl;
166     }
167     gotoxy(0,23);
168     system("pause");
169     return 0;
170 }
171 Maze::Maze(int w,int h){
172     this->w = w;
173     this->h = h;
174     map = new char*[h];
175     for(int i = 0;i < h;i++){
176         map[i] = new char[w];
177     }
178     bg = ' ';
179     wall = '#';
180     cat = '+';
181 }
182 void Maze::setPattern(char bg,char wall,char cat){
183     this->bg = bg;
184     this->wall = wall;
185     this->cat = cat;
186 }
187 void Maze::initialization(char bg,char wall){
188     srand(time(NULL));
189     for(int i = 0;i < h;i++){
190         for(int j = 0;j < w;j++){
191             if(i == 0||j == 0||i == h - 1||j == w  - 1){
192                 map[i][j] = wall;
193             }
194             else{
195                 map[i][j] = rand() % 4 == 0 ? wall : bg;
196             }
197         }
198     }
199     map[1][1] = bg;
200     map[0][1] = bg;
201     map[0][0] = bg;
202     map[h - 1][w - 1] = bg;
203     map[h - 1][w - 2] = bg;
204 }
205 void Maze::show(){
206     for(int i = 0;i < h;i++){
207         for(int j = 0;j < w;j++){
208             cout<<map[i][j];
209         }
210         cout<<endl;
211     }
212 }
213 bool Maze::move(int x,int y){
214     if(x<0||y<0){        //x,y是否合法
215         return false;
216     }
217     if(x == w - 1&&y == h - 1){            //到达终点返回true
218         return true;
219     }
220     //未到达终点
221     if(map[y][x] == bg){                //如果该点是可以走的
222         gotoxy(x,y);
223         cout<<cat;
224         Sleep(5);
225         map[y][x] = cat;                //每走一格就填充,否则会倒退死循环
226         //再走下一步
227         if(move(x + 1,y)||move(x,y + 1)||move(x,y - 1)||move(x - 1,y)){                            //如果到达了终点,直接返回true
228             return true;
229         }
230         //如果该点被走过但无法到达终点,标记为-
231         else{                                
232             gotoxy(x,y);
233             cout<<'-';
234         }
235     }
236     return false;
237 }
BY oleolema
原文地址:https://www.cnblogs.com/oleolema/p/9028393.html