whileTrue: prev = [row[:] for row in grid] h, w = len(grid), len(grid[0])
for y inrange(h): for x inrange(w): if grid[y][x] in attached: grid[y][x] = 0 if grid[y][x] and y + 1 < h and (grid[y + 1][x] in attached ornot grid[y + 1][x]): grid[y + 1][x], grid[y][x] = grid[y][x], 0
ifall(cell == 0for cell in grid[0]): grid.pop(0)
ifsum(row[0] for row in grid) == 0: for row in grid: row.pop(0)
ifsum(row[-1] for row in grid) == 0: for row in grid: row.pop()
if prev == grid: break
for row in grid: print(*row)
C++
本题的 C++ 题解经由 Python 题解由 Claude Sonnet 4.5 转写而来,仅保证逻辑基本一致,未做任何优化。
// 读取网格 vector<vector<int>> grid(n); for (int i = 0; i < n; i++) { getline(cin, line); istringstream row_iss(line); int val; while (row_iss >> val) { grid[i].push_back(val); } }
// 主循环 while (true) { // 保存当前状态 vector<vector<int>> prev = grid; int h = grid.size(); int w = grid[0].size();
// 处理 attached 和下落 for (int y = 0; y < h; y++) { for (int x = 0; x < w; x++) { if (attached.count(grid[y][x])) { grid[y][x] = 0; } if (grid[y][x] != 0 && y + 1 < h && (attached.count(grid[y + 1][x]) || grid[y + 1][x] == 0)) { swap(grid[y + 1][x], grid[y][x]); } } }
// 删除首行(如果全为0) if (!grid.empty()) { bool all_zero = true; for (int x = 0; x < grid[0].size(); x++) { if (grid[0][x] != 0) { all_zero = false; break; } } if (all_zero) { grid.erase(grid.begin()); } }
// 删除首列(如果全为0) if (!grid.empty()) { int sum = 0; for (auto& row : grid) { sum += row[0]; } if (sum == 0) { for (auto& row : grid) { row.erase(row.begin()); } } }
// 删除末列(如果全为0) if (!grid.empty() && !grid[0].empty()) { int sum = 0; for (auto& row : grid) { sum += row.back(); } if (sum == 0) { for (auto& row : grid) { row.pop_back(); } } }
// 检查是否收敛 if (prev == grid) { break; } }
// 输出结果 for (constauto& row : grid) { for (int i = 0; i < row.size(); i++) { if (i > 0) cout << " "; cout << row[i]; } cout << endl; }