P1141 01迷宫(dfs+染色联通块)

P1141 01迷宫(dfs+染色联通块)_第1张图片

P1141 01迷宫(dfs+染色联通块)_第2张图片 染色联通块:

一个格联通的所有格

每个对应的最大可联通格子的个数均相同

分析:

1.只需要计算每个块里的元素个数

2.元素标记对应某个块

3.查找元素时:

由        (1)元素坐标->

           (2)查找对应块的编号(visit[]查询)->

           (3)输出对应块的元素个数(item[]查询)

 代码如下:

#include
using namespace std;

int next1[5][3] = { {1,0},{-1,0},{0,1},{0,-1} };

// 迷宫
char map[1009][1009] = {0};

int visit[1009][1009] = { 0 };

// 记录联通块记录的数量
int item[1000009] = { 0 }, k = 1;

// 记录单个联通块的元素数量
int n = 1;

// 矩阵的边长,查看的数量
int num = 0, check = 0;
void bfs(int x, int y);
int main()
{

	scanf("%d %d", &num, &check);

	for (int i = 0; i < num; i++)
	{
		scanf("%s", map[i]);
	}

	// 如果map为0,即该点未有联通块
	for (int i = 0; i < num; i++)
	{
		for (int j = 0; j < num; j++)
		{
			if (!visit[i][j])
			{
				visit[i][j] = k; item[k] = 1;

				bfs(i, j);
				item[k] = n;
				k++; n = 1;
			}
		}
	}

	for (int i = 0; i < check; i++)
	{
		int t1 = 0, t2 = 0;
		scanf("%d %d", &t1, &t2);
		cout << item[visit[t1 - 1][t2 - 1]] << endl;
	}
	return 0;
}
void bfs(int x, int y)
{
	for (int i = 0; i < 4; i++)
	{	// 广度四个方向
		int tx = x + next1[i][0], ty = y + next1[i][1];

		// 数组溢出continue
		if (tx < 0 || tx >= num || ty < 0 || ty >= num) continue;

		// 该方向是一样,无法走continue
		if (map[x][y] == map[tx][ty]) continue;

		if (!visit[tx][ty])
		{
			// 标记坐标属于的联通块编号
			visit[tx][ty] = k;

			// 计算该联通块的元素数量
			n++;
			bfs(tx, ty);
		}
	}
}

你可能感兴趣的:(#,DFS,深度优先,算法,c++)