描述 有个巨大的棋盘,开始所有格子都是空的,现在小明拿来N(1≤N≤10^5)个黑色棋子。他会把棋子一个个放到棋盘的格子(xi,yi)中,任何两枚棋子都不会出现在同一个格子上。如果一个棋子的水平或者垂直方向恰好有3枚棋子与其相邻,那么就给这枚打上记号,但如果在后面放入棋子的过程中造成这枚棋子水平方向或者垂直方向不止有3枚棋子与其相邻,那么记号就会被擦去。那么请你在每一次放入棋子后都输出此时被打上标记的棋子总数。 输入 输入第1行一个整数N,表示棋子数目。 接下来输入N行,每行包含2个整数,表示棋子放入的位置坐标xi和yi。 输出 输出一共N行,每行输出一个整数,表示此时被打上标记的棋子总数。 输入样例 1 8 0 1 1 0 1 1 1 2 2 1 2 2 3 1 3 2 输出样例 1 0 0 0 1 0 0 1 2 提示 1≤N≤10^5; 0≤xi,yi≤1000 c++代码,不要解释
时间: 2024-04-08 20:35:08 浏览: 155
```cpp
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;
int main() {
int N;
cin >> N;
vector<pair<int, int>> positions(N);
vector<vector<int>> grid(1001, vector<int>(1001, 0));
unordered_set<int> marked;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {-1, 1, 0, 0};
for (int i = 0; i < N; i++) {
int x, y;
cin >> x >> y;
positions[i] = make_pair(x, y);
// Check if neighboring cells have 3 or more chess pieces
int count = 0;
for (int j = 0; j < 4; j++) {
int nx = x + dx[j];
int ny = y + dy[j];
if (nx >= 0 && nx <= 1000 && ny >= 0 && ny <= 1000 && grid[nx][ny] >= 2) {
count++;
}
}
// Mark the chess piece if it has 3 or more neighboring chess pieces
if (count >= 3) {
grid[x][y] = 2;
marked.insert(i);
} else {
grid[x][y] = 1;
}
cout << marked.size() << endl;
}
return 0;
}
```
阅读全文