多线程迷宫问题

分享一个使用多线程的迷宫问题

  • join()函数是一个等待线程完成函数,主线程需要等待子线程运行结束了才可以结束:
  • detach()称为分离线程函数,使用detach()函数会让线程在后台运行,即说明主线程不会等待子线程运行结束才结束。
/*
基于多线程的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#
####################
posted @ 2020-10-09 12:08  wsl-hitsz  阅读(196)  评论(0编辑  收藏  举报