题目
CodeForce 1600J. Robot Factory
这道题很逆天。注意输出的时候最后一个元素是有空格的。不然第一个例子就过不了。
代码
#include<bits/stdc++.h>
using namespace std;
vector<vector<int>> b, visited;
int n, m;
int dirs[4][2] = {
{0, -1},
{1, 0},
{0, 1},
{-1, 0},
};
int room_size = 0;
void bfs(int i, int j) {
visited[i][j] = 1;
queue<pair<int, int>> q;
q.push({i, j});
room_size = 1;
while (!q.empty()) {
auto p = q.front();
q.pop();
int x = p.first;
int y = p.second;
for (int d = 0; d < 4; ++d) {
if (((b[x][y] >> d) & 1))
continue;
int nx = x + dirs[d][0];
int ny = y + dirs[d][1];
if (nx >= 0 && nx < n && ny >= 0 && ny < m && !visited[nx][ny]) {
visited[nx][ny] = 1;
++room_size;
q.push({nx, ny});
}
}
}
}
int main() {
cin >> n >> m;
b.resize(n, vector<int>(m));
visited.resize(n, vector<int>(m));
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
cin >> b[i][j];
vector<int> ans;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (!visited[i][j]) {
room_size = 0;
bfs(i, j);
ans.push_back(room_size);
}
}
}
sort(ans.begin(), ans.end(), [&](int a, int b) {
return a > b;
});
int len = ans.size();
for (int i = 0; i < len; ++i) {
printf("%d ", ans[i]);
}
}