<style> html, body, .ui-content { background-image: url(https://truth.bahamut.com.tw/s01/201508/7f0e4bd0e01135c9df434733e0d1544a.JPG); background-color: #333; color: #DDD; } </style> ###### tags: `Meowmeow Online Judge` # Counting Rooms ## Description You are given a map of a building, and your task is to count the number of its rooms. The size of the map is $n×m$ squares, and each square is either floor or wall. You can walk left, right, up, and down through the floor squares. ## Input The first line has two integers nn and mm: the height and width of the map. Then there are nn lines of mm characters describing the map. Each character is either . (floor) or # (wall). 1 $10001≤n,m≤1000$ ## Output Print one integer: the number of rooms. ## 解題思路 從(0,0)到(n - 1, m - 1),遇到floor做BFS把同一個room的floor都填成wall,並把room數+1 ### 時間複雜度 $O(n*m)$ ## Code ```c++ #include <iostream> #include <queue> #include <utility> #include <vector> #include <string> int main() { int height, width; int rooms = 0; std::cin >> height >> width; std::vector<std::string> building(height); for (auto &it : building) std::cin >> it; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (building[i][j] == '.') { rooms++; std::deque< std::pair<int, int> > dq; building[i][j] = '#'; dq.emplace_back(i, j); while (!dq.empty()) { auto &f = dq.front(); // std::cout << f.first << ',' << f.second << std::endl; if (f.first - 1 >= 0 && building[f.first - 1][f.second] == '.') { building[f.first - 1][f.second] = '#'; dq.emplace_back(f.first - 1, f.second); } if (f.first + 1 < height && building[f.first + 1][f.second] == '.') { building[f.first + 1][f.second] = '#'; dq.emplace_back(f.first + 1, f.second); } if (f.second - 1 >= 0 && building[f.first][f.second - 1] == '.') { building[f.first][f.second - 1] = '#'; dq.emplace_back(f.first, f.second - 1); } if (f.second + 1 < width && building[f.first][f.second + 1] == '.') { building[f.first][f.second + 1] = '#'; dq.emplace_back(f.first, f.second + 1); } dq.pop_front(); } } } } std::cout << rooms << std::endl; } ```