-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBFS_IN_MULTI_THREADS.cpp
More file actions
219 lines (214 loc) · 4.64 KB
/
BFS_IN_MULTI_THREADS.cpp
File metadata and controls
219 lines (214 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
/*
基于多线程的BFS迷宫实现
此代码由懒猫老师的学生小林同学版权所有,如需转发,请注明出处
*/
#include <thread>//多线程头文件
#include<Windows.h>//用于窗口等待Sleep
#include <iostream>
using namespace std;
#define WAIT_TIME 1000//加载时间,越小越快
string* maze = NULL;//输入的迷宫
int maze_height = 0;//迷宫高度
int flag = 0;//结束标志
int aim_x = 0, aim_y = 0;//终点坐标
int** maze_road;//迷宫数组
int road_num = 0, road_num_flag = -1;//创建寻路线程次数,寻路线程次数标记
void printMap();
void findRoad(int x, int y, int direction);
void continuePrintMap();
int main()
{
/*输入数据*/
cout << "迷宫高为:";
cin >> maze_height;
cout << "请输入迷宫(墙壁为#):" << endl;
maze = new string[maze_height];
for (int i = 0; i < maze_height; i++)
{
cin >> maze[i];
}
cout << "请输入迷宫终点(x,y):" << endl;
cin >> aim_x >> aim_y;
/*构造迷宫数组*/
maze_road = new int* [maze_height];
if (maze_road)
memset(maze_road, 0, sizeof(int*) * maze_height);
for (int i = 0; i < maze_height; i++)
{
maze_road[i] = new int[maze[i].size() + 1];
for (unsigned int j = 0; j < maze[i].size() + 1; j++)
{
if (maze[i][j] != '#')
maze_road[i][j] = 0;
else
maze_road[i][j] = -1;
}
}
/*打开多线程*/
system("cls");//清屏
thread print_map(continuePrintMap);
print_map.detach();
thread find_road(findRoad, 1, 1, 0);
find_road.detach();
/*后续*/
while (1)
{
/*没找到路径不继续*/
if (flag == 1)
break;
}
system("cls");
printMap();//最终迷宫图
/*收尾删除*/
for (int i = 0; i < maze_height; i++)
{
delete[] maze_road[i];
}
if (maze_road)
delete[] maze_road;
maze_road = NULL;
delete[] maze;
maze = NULL;
return 0;
}
/*多线程持续打印迷宫*/
void continuePrintMap()
{
while (1)
{
/*不再找了也停止(机器人全灭)*/
if (road_num_flag == road_num)
{
flag = 1;
return;
}
/*找到位置就停止*/
if (flag == 1)
return;
printMap();
}
}
/*打印迷宫*/
void printMap()
{
/*光标移动到(0,0),不用cls因为会闪*/
road_num_flag = road_num;
printf_s("\33[0;0H");
for (int i = 0; i < maze_height; i++)
{
for (unsigned int j = 0; j < maze[i].size(); j++)
{
if (maze_road[i][j] == -1)
printf_s("%3c", maze[i][j]);//打印墙
else
printf_s("%3d", maze_road[i][j]);//打印路
/*else if(maze_road[i][j] == -2)
printf_s(" X");*/
}
cout << endl;
}
Sleep(WAIT_TIME);
}
/*
多线程迷宫寻路机器人
x 当前x坐标
y 当前y坐标
direction:
0 没有前一个位置
1 前一个位置在↑
2 前一个位置在↓
3 前一个位置在←
4 前一个位置在→
*/
void findRoad(int x, int y, int direction)
{
Sleep(WAIT_TIME);
road_num++;
/**/
if (flag == 1)//寻路完成提前退出
return;
switch (direction) //记录当前走到第几步
{
case 1: {
maze_road[x][y] = maze_road[x - 1][y] + 1;
break;
}
case 2: {
maze_road[x][y] = maze_road[x + 1][y] + 1;
break;
}
case 3: {
maze_road[x][y] = maze_road[x][y - 1] + 1;
break;
}
case 4: {
maze_road[x][y] = maze_road[x][y + 1] + 1;
break;
}
default:
break;
}
/*寻路成功,标记并退出*/
if (x == aim_x && y == aim_y)
{
flag = 1;
return;
}
/*向四个方向,有路则释放新的机器人(创建新线程)*/
if (maze_road[x - 1][y] == 0)
{
thread find_road_up(findRoad, x - 1, y, 2);
find_road_up.detach();
}
if (maze_road[x + 1][y] == 0)
{
thread find_road_down(findRoad, x + 1, y, 1);
find_road_down.detach();
}
if (maze_road[x][y - 1] == 0)
{
thread find_road_left(findRoad, x, y - 1, 4);
find_road_left.detach();
}
if (maze_road[x][y + 1] == 0)
{
thread find_road_right(findRoad, x, y + 1, 3);
find_road_right.detach();
}
/*分裂成新的机器人后,本机器人销毁*/
Sleep(WAIT_TIME * 2);
maze_road[x][y] = -2;
return;
}
测试数据1:
##########
#00#000#0#
#00#000#0#
#0000##00#
#0###0000#
#000#0000#
#0#000#00#
#0###0##0#
##0000000#
##########
测试数据2:
####################
#0####0#0000########
#0###0000##0000000##
#0####0######0##0###
#000000######00#00##
#########00000######
##00000000###000####
##0##0##############
##0##0####0##0######
##0##000000000000###
#00#########0#######
##00000#####000#####
######0#############
######0#############
##0000000000000#####
##0####0#####0######
##0000#0#####0######
#######0############
#######000000000000#
####################