消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这些棋子都被消除。当有多处可以被消除时,这些地方的棋子将同时被消除。 现在给定一个n行m列的棋盘,棋盘中的每一个方格上有一个棋子(用数字1-9表示各种颜色的棋子),请给出经过消除后的棋盘。 请注意:一个棋子可能在某一行和某一列同时被消除。 【输入形式】 从标准输入读取数据,第一行包含两个整数n和m,分别表示棋盘的行数和列数(行数和列数都大于等于3,小于等于9),以一个空格分隔这两个整数。 接下来输入n行,每行m个整数,用一个空格分隔各个整数,这些整数分别表示每一个方格中棋子的颜色(大于等于1,小于等于9)。 【输出形式】 向标准输出上输出n行,每行m个整数,相邻整数之间以一个空格分隔,表示经过消除后的棋盘。如果一个方格中的棋子被消除,则对应的方格输出数字0,否则输出代表原棋子颜色的整数。每行最后一个整数后也要有一个空格。
时间: 2024-03-23 20:40:33 浏览: 17
这道题可以使用模拟的方法来解决。我们可以遍历整个棋盘,找到连续三个或者更多的相同颜色的棋子,然后将它们标记为0,再重复这个过程,直到没有任何可以被消除的棋子为止。
以下是Python代码:
```python
n, m = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(n)]
def eliminate():
# 标记需要被消除的棋子
flag = False
for i in range(n):
for j in range(m):
if board[i][j] == 0:
continue
# 查找横向的连续棋子
cnt = 1
while j+cnt < m and board[i][j+cnt] == board[i][j]:
cnt += 1
if cnt >= 3:
flag = True
for k in range(cnt):
board[i][j+k] = 0
# 查找纵向的连续棋子
cnt = 1
while i+cnt < n and board[i+cnt][j] == board[i][j]:
cnt += 1
if cnt >= 3:
flag = True
for k in range(cnt):
board[i+k][j] = 0
return flag
while eliminate():
# 将标记为0的棋子下移
for j in range(m):
idx = n-1
for i in range(n-1, -1, -1):
if board[i][j] != 0:
board[idx][j] = board[i][j]
idx -= 1
for i in range(idx+1):
board[i][j] = 0
# 输出结果
for i in range(n):
for j in range(m):
print(board[i][j], end=" ")
print()
```
输入样例:
```
4 5
1 2 2 2 3
4 1 1 3 3
4 4 4 1 1
5 5 5 1 1
```
输出样例:
```
1 0 0 0 3
4 0 0 0 0
0 0 0 0 0
5 0 0 0 0
```