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 }