数据结构实习

  1 #include <iostream>
  2 #include <windows.h>
  3 #include <cstdio>
  4 #include <cmath>
  5 #include <time.h>
  6 #include <cstring>
  7 
  8 using namespace std;
  9 
 10 const int N = 1000;
 11 int fa[N], len_path, maze[N][N], book[N][N];
 12 int dx[4] = {1, 0, -1, 0};
 13 int dy[4] = {0, 1, 0, -1};
 14 
 15 void init()
 16 {
 17     for(int i = 0; i < N; i++)
 18         fa[i] = i;
 19 }
 20 
 21 int getfa(int x)
 22 {
 23     if(fa[x] == x)return x;
 24     else return fa[x] = getfa(fa[x]);
 25 }
 26 
 27 void Merge(int a, int b)
 28 {
 29     int af = getfa(a);
 30     int bf = getfa(b);
 31     if(af != bf)
 32         fa[bf] = af;
 33 }
 34 
 35 int tolist(int x, int y, int n)
 36 {
 37     return x*n+y;
 38 }
 39 
 40 void print(int n)
 41 {
 42     for(int i = 0; i < n; i++)
 43     {
 44         for(int j = 0; j < n; j++)
 45             cout<<maze[i][j]<<" ";
 46         cout<<endl;
 47     }
 48 }
 49 
 50 void mazeInit(int n)
 51 {
 52     int sx, sy, ex, ey, x, y;
 53     init();
 54     for(int i = 0; i < n; i++)
 55         for(int j = 0; j < n; j++)
 56             maze[i][j] = 1;
 57     for(int i = 1; i < n; i++)
 58     {
 59         if(i&1)
 60             for(int j = 1; j < n; j+=2)
 61                 maze[i][j] = 0;
 62     }
 63     print(n);
 64     cout<<"*********************"<<endl;
 65     srand(time(NULL));
 66     int d;
 67     int tx1, ty1, tx2, ty2;
 68     sx = sy = 1;
 69     ex = ey = n-3;
 70 
 71     // sx = rand()%(n-2)+1;
 72     // sy = rand()%(n-2)+1;
 73     // do
 74     // {
 75     //     ex = rand()%(n-2)+1;
 76     //     ey = (rand()+2333)%(n-2)+1;
 77     // }while(sx!=ex && sy!=ey);
 78     cout<<"ok"<<endl;
 79     maze[sx][sy] = maze[ex][ey] = 0;
 80     while(getfa(tolist(sx, sy, n)) != getfa(tolist(ex, ey, n)))
 81     {
 82         do
 83         {
 84             x = rand()%(n-2)+1;
 85             y = (rand()+2333)%(n-2)+1;
 86         }
 87         while(maze[x][y] != 1);
 88         d = x%2;
 89         if(!d)
 90         {
 91             tx1 = x+1;
 92             ty1 = y;
 93             tx2 = x-1;
 94             ty2 = y;
 95             if(getfa(tolist(tx1, ty1, n)) != getfa(tolist(tx2, ty2, n)))
 96             {
 97                 maze[x][y] = 0;
 98                 Merge(tolist(tx1, ty1, n), tolist(tx2, ty2, n));
 99             }
100         }
101         else
102         {
103             tx1 = x;
104             ty1 = y+1;
105             tx2 = x;
106             ty2 = y-1;
107             if(getfa(tolist(tx1, ty1, n)) != getfa(tolist(tx2, ty2, n)))
108             {
109                 maze[x][y] = 0;
110                 Merge(tolist(tx1, ty1, n), tolist(tx2, ty2, n));
111             }
112         }
113     }
114     for(int i = 0; i < n; i++)
115     {
116         maze[i][n-1] = 1;
117         maze[n-1][i] = 1;
118     }
119     maze[sx][sy] = 2;
120     maze[ex][ey] = 3;
121     print(n);
122 }
123 
124 struct point
125 {
126     int x, y, pre;
127 }q[N], path[N];
128 
129 void getPath(int pos)
130 {
131     while(pos != -1)
132     {
133         path[len_path].x = q[pos].x;
134         path[len_path].y = q[pos].y;
135         len_path++;
136         pos = q[pos].pre;
137     }
138 }
139 
140 void bfs(int n)
141 {
142     int front, tail, sx, sy, ex, ey;
143     for(int i = 0; i < n; i++)
144         for(int j = 0; j < n; j++)
145             if(maze[i][j] == 2)
146             {
147                 sx = i; sy = j;
148             }
149     front = tail = 0;
150     q[tail].x = sx;
151     q[tail].y = sy;
152     q[tail].pre = -1;
153     tail++;
154     int x, y, nx, ny;
155     bool fg = false;
156     while(front < tail)
157     {
158         x = q[front].x;
159         y = q[front].y;
160         for(int i = 0; i < 4; i++)
161         {
162             nx = x+dx[i];
163             ny = y+dy[i];
164             if(nx>=0&&nx<n&&ny>=0&&ny<n&&maze[nx][ny]==0)
165             {
166                 maze[nx][ny] = 1;
167                 q[tail].x = nx;
168                 q[tail].y = ny;
169                 q[tail].pre = front;
170                 tail++;
171             }
172             if(maze[nx][ny] == 3){
173                 q[tail].x = nx;
174                 q[tail].y = ny;
175                 q[tail].pre = front;
176                 tail++;
177                 fg = true;
178                 len_path = 0;
179                 path[len_path].x = nx;
180                 path[len_path].y = ny;
181                 len_path++;
182                 getPath(front);
183             }
184         }
185         if(fg)break;
186         front++;
187     }
188 }
189 
190 void printPath()
191 {
192     for(int i = len_path-1; i >= 0; i--)
193         cout<<path[i].x<<" "<<path[i].y<<endl;
194 }
195 
196 int main()
197 {
198     int n = 10;
199     mazeInit(n);
200     bfs(n);
201     printPath();
202     return 0;
203 }
原文地址:https://www.cnblogs.com/Penn000/p/6197768.html