【題解】CSES - Counting Rooms

題目大意

給定一張大小為 $n \times m$ 的地圖,地圖上有地板和牆壁。地板和地板之間若相連則形成一個房間,問有幾個房間?
  • $1 \leq n, m \leq 10^3$

題解

我們對每個格子逐一檢查。每當我們遇到新的地板,把房間數量 $+1$,並往外檢查他還連通到哪些地板,把這些位置都塗成牆壁。往外檢查的部分可以用 BFS 或是 DFS 時做 (厲害一點甚至可以用並查集)。底下的程式碼是用 DFS 實作。
#include <bits/stdc++.h>
using namespace std;

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

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int n, m;
	cin >> n >> m;
	vector<string> grid(n);
	for(int i = 0; i < n; i++) {
		cin >> grid[i];
	}
	auto dfs = [&](auto dfs, int i, int j) -> void {
		grid[i][j] = '#';
		for(int dir = 0; dir < 4; dir++) {
			int ni = i + dx[dir];
			int nj = j + dy[dir];
			if(ni >= 0 && ni < n && nj >= 0 && nj < m && grid[ni][nj] == '.') {
				dfs(dfs, ni, nj);
			}
		}
	};
	int ans = 0;
	for(int i = 0; i < n; i++) {
		for(int j = 0; j < m; j++) {
			if(grid[i][j] == '.') {
				dfs(dfs, i, j);
				ans++;
			}
		}
	}
	cout << ans << "\n";
	return 0;
}

如果本文對您有幫助的話幫忙點擊廣告和分享吧!

© 若無特別註明,本站文章皆由 WeakMouse's Coding Blog 原創 ,轉載引用本文前請先留言告知。本文轉載請註明文章源自 WeakMouse's Coding Blog ,作者 ,並附上原文連結: 【題解】CSES - Counting Rooms

張貼留言

0 留言