2. 洪水填充算法

#include
#include
using namespace std;
/// 
/// 洪水填充算法
/// 概念:从一点开始,遍历它周围具有相同性质的点,并将其和该点做同样处理,直到遇到不同性质的点
/// 特点:一种确定联通区域的算法
/// 应用:根据已知所有非障碍点和利用洪水填充算法计数得到的非障碍点判断所有离散空间彼此是否联通
/// 

struct vector2
{
	int x;
	int y;
};

int main()
{
	//具体算法:队列迭代广度优先搜索四方向
	
	//定义地图,1表示障碍物,0表示无障碍点
	int map[5][5] = {
		{1,0,0,0,0},
		{0,0,0,0,0},
		{0,1,0,0,0},
		{1,0,1,1,0},
		{0,1,1,0,0}
	};
	//记录地图无障碍点个数
	int walkable = 18;
	//定义栈
	queue<vector2> vecQueue;
	//将中间位置加入栈
	vector2 center;
	center.x = 2; center.y = 2;
	vecQueue.push(center);
	//统计搜索到的有效点个数
	int availableNum = 1;
	//广度优先搜索
	while (vecQueue.size() > 0)
	{
		//取出一个节点
		vector2 vec = vecQueue.front();
		vecQueue.pop();
		//将它进行处理
		map[vec.y][vec.x] = 2;
		//遍历它周围的相同性质的节点
		if (vec.x + 1 < 5 && map[vec.y][vec.x + 1] == 0)
		{
			vector2 point;
			point.x = vec.x + 1; point.y = vec.y;
			vecQueue.push(point);
			availableNum++;
		}
		if (vec.x - 1 >=0 && map[vec.y][vec.x - 1] == 0)
		{
			vector2 point;
			point.x = vec.x - 1; point.y = vec.y;
			vecQueue.push(point);
			availableNum++;
		}
		if (vec.y + 1 < 5 && map[vec.y+1][vec.x] == 0)
		{
			vector2 point;
			point.x = vec.x; point.y = vec.y+1;
			vecQueue.push(point);
			availableNum++;
		}
		if (vec.y - 1 >=0 && map[vec.y-1][vec.x] == 0)
		{
			vector2 point;
			point.x = vec.x; point.y = vec.y-1;
			vecQueue.push(point);
			availableNum++;
		}
	}

	//输出填充结果
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
			cout << map[i][j] << ",";
		}
		cout << endl;
	}

	//检查是否所有非障碍点都可达
	if (availableNum == walkable)
	{
		cout << endl << "地图是联通的!" << endl;
	}
	else
	{
		cout << endl << "地图不是联通的!" << endl;
	}

	return 0;
}

你可能感兴趣的:(算法,经验分享,算法,c++)