BFS求四连通块数目

裸BFS的题目。输入是一个n*m的矩阵,矩阵由0-9的数字构成,0表示海水,数字表示陆地,求四连通的陆地块的数目。

今天发现,BFS在遍历到某个结点时,先访问该结点再将邻接点入队和先将邻结点入队再访问该结点没有本质区别。而DFS则需要在某个结点可以深入的结点全部访问完再回溯到该结点时,再对其进行访问。

代码:

// 1329.cpp : 定义控制台应用程序的入口点。
// AC
// BFS求四连通块数目

#include "stdafx.h"
#include 
#include 
#include 

#define MAX 100

using std::cin;
using std::cout;
using std::endl;
using std::cerr;
using std::deque;
using std::string;

struct Point {
	int x;
	int y;
	Point(int _x, int _y) :x(_x), y(_y) {}
};

//将(x,y)当做源点做bfs
void BFS(int a[][MAX], int n, int m, int x, int y,bool visit[][MAX])
{
	deque Q;
	Q.push_back(Point(x, y)); //初始化队列
	while (!Q.empty())
	{
		Point temp = Q.front();
		Q.pop_front();
		int temp_x = temp.x;
		int temp_y = temp.y;

		visit[temp_x][temp_y] = true; //访问该结点
		
		//所有未访问的邻居结点入队列
		if (temp_x - 1 >= 0 && temp_x - 1 < n&&temp_y >= 0 && temp_y < m)
		{
			if (!visit[temp_x - 1][temp_y] && a[temp_x - 1][temp_y] != 0)
				Q.push_back(Point(temp_x - 1, temp_y));
		}

		if (temp_x + 1 >= 0 && temp_x + 1 < n&&temp_y >= 0 && temp_y < m)
		{
			if (!visit[temp_x + 1][temp_y] && a[temp_x + 1][temp_y] != 0)
				Q.push_back(Point(temp_x + 1, temp_y));
		}

		if (temp_x >= 0 && temp_x < n&&temp_y - 1 >= 0 && temp_y - 1 < m)
		{
			if (!visit[temp_x][temp_y - 1] && a[temp_x][temp_y - 1] != 0)
				Q.push_back(Point(temp_x, temp_y - 1));
		}

		if (temp_x >= 0 && temp_x < n&&temp_y + 1 >= 0 && temp_y + 1 < m)
		{
			if (!visit[temp_x][temp_y + 1] && a[temp_x][temp_y + 1] != 0)
				Q.push_back(Point(temp_x, temp_y + 1));
		}

	}

}

int main()
{
	int n, m;
	cin >> n >> m;
	int a[MAX][MAX];

	bool visit[MAX][MAX];

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			visit[i][j] = false;

	string temp;
	for (int i = 0; i < n; i++)
	{
		cin >> temp;
		for (int j = 0; j < m; j++)
			a[i][j] = temp[j] - '0';
	}

	/*for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
			cerr << a[i][j] << " ";

		cerr << endl;
	}*/

	int cnt = 0;
	for(int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			//每次选取一个未访问过的细胞数字做BFS
			if (!visit[i][j] && a[i][j] != 0)
			{
				++cnt;
				BFS(a, n, m, i, j, visit);
			}
		}
	
	cout << cnt << endl;

	system("pause");
	return 0;
}

运行结果:

BFS求四连通块数目_第1张图片

你可能感兴趣的:(algorithm)