洛谷 P1506 拯救oibh总部-dfs染色法

题目背景

oibh总部突然被水淹没了!现在需要你的救援……
题目描述

oibh被突来的洪水淹没了>.<还好oibh总部有在某些重要的地方起一些围墙,用号表示,而一个封闭的号区域洪水是进不去的……现在给出oibh的围墙建设图,问oibh总部没被淹到的重要区域(由"0"表示)有多少。
输入格式

第一行是两个数,x和y(x,y<=500)

第二行及以下是一个由和0组成的xy的图。
输出格式

输出没被水淹没的oibh总部的“0”的数量。

样例输入1
4 5
00000
00*00
0*0*0
00*00

样例输入2
5 5
*****
*0*0*
**0**
*0*0*
*****
样例输出1
1

样例输出2
5

代码如下:

#include 
using namespace std;
const int N = 510;
int mp[N][N];

int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};

int n, m;
void dfs(int x, int y) {
	for (int i = 0; i < 4; i++) {
		int xx = x + dx[i], yy = y + dy[i];
		if (xx < 0 || xx > n + 1 || yy < 0 || yy > m + 1 || mp[xx][yy])
			continue;
		mp[xx][yy] = 1;
		dfs(xx, yy);
	}
}

int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
			char c;
			cin >> c;
			if (c == '0')
				mp[i][j] = 0;
			else
				mp[i][j] = 1;
		}
	dfs(0, 0);
	int ans = 0;
	for (int i  = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (!mp[i][j])
				ans++;
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(蓝桥杯训练,dfs,c++,算法,染色法,递归)