消消乐代码 python
笔试有两次做到消消乐了,所以记录一下。实现消消乐要做一下几步:
用字母代表颜色,用“0”代表空
- 检查x(y)方向是否有相同格子数大于3可以消除
- 消除格子后,检查每个空格子上面是否不为空,不为空则往下落
- 没有可以消除的格子则退出
检查是否需要往下掉落
每次循环,都需要先检查是否需要掉落
# 检查每一个是否为都掉下去了
def check():
for i in range(R-1,-1,-1):
for j in range(0,C,1):
k = 0
while mmap[i][j] == 0 and k < i:
for z in range(i,k,-1):
mmap[z][j] = mmap[z-1][j]
mmap[k][j] = '0'
k += 1
检查相同颜色大于三的格子,输出他们的坐标
def dfs_x(i,j):
stack = [(i,j)]
res = []
while stack:
x,y = stack.pop()
res.append([x,y])
if mmap[i][j] != '0':
if x-1 >= 0 and [x-1,y] not in res and mmap[x-1][y] == mmap[i][j]:
stack.append((x-1,y))
if x+1 <= R-1 and [x+1,y] not in res and mmap[x+1][y] == mmap[i][j]:
stack.append((x+1,y))
if len(res) >= 3:
return (True,res)
else:
return (False,[])
x方向和y方向写法一样,这里不再赘述
删除格子
while 1:
check()
del_x = []
del_y = []
for i in range(R):
for j in range(C):
tag_x, res_x = dfs_x(i,j)
del_x += res_x
tag_x, res_y = dfs_y(i,j)
del_y += res_y
if not del_x and not del_y:
break
else:
for i,j in del_x:
mmap[i][j] = '0'
for i,j in del_y:
mmap[i][j] = '0'
完整代码
R,C = list(map(int,input().split()))
mmap = [[0 for _ in range(C)] for _ in range(R)]
for i in range(R):
mmap[i][:] = list(input())
x1,y1,x2,y2 = list(map(int,input().split()))
mmap[x1][y1], mmap[x2][y2] = mmap[x2][y2], mmap[x1][y1]
d = 0
for i in range(R):
for j in range(C):
if mmap[i][j] == '0':
d += 1
def dfs_x(i,j):
stack = [(i,j)]
res = []
while stack:
x,y = stack.pop()
res.append([x,y])
if mmap[i][j] != '0':
if x-1 >= 0 and [x-1,y] not in res and mmap[x-1][y] == mmap[i][j]:
stack.append((x-1,y))
if x+1 <= R-1 and [x+1,y] not in res and mmap[x+1][y] == mmap[i][j]:
stack.append((x+1,y))
if len(res) >= 3:
return (True,res)
else:
return (False,[])
def dfs_y(i,j):
stack = [(i,j)]
res = []
while stack:
x,y = stack.pop()
res.append([x,y])
if mmap[i][j] != '0':
if y-1 >= 0 and [x,y-1] not in res and mmap[x][y-1] == mmap[i][j]:
stack.append((x,y-1))
if y+1 <= C-1 and [x,y+1] not in res and mmap[x][y+1] == mmap[i][j]:
stack.append((x,y+1))
if len(res) >= 3:
return (True,res)
else:
return (False,[])
# 检查每一个是否为都掉下去了
def check():
for i in range(R-1,-1,-1):
for j in range(0,C,1):
k = 0
while mmap[i][j] == 0 and k < i:
for z in range(i,k,-1):
mmap[z][j] = mmap[z-1][j]
mmap[k][j] = '0'
k += 1
while 1:
check()
del_x = []
del_y = []
for i in range(R):
for j in range(C):
tag_x, res_x = dfs_x(i,j)
del_x += res_x
tag_x, res_y = dfs_y(i,j)
del_y += res_y
if not del_x and not del_y:
break
else:
for i,j in del_x:
mmap[i][j] = '0'
for i,j in del_y:
mmap[i][j] = '0'
c = 0
for i in range(R):
for j in range(C):
if mmap[i][j] == '0':
c += 1
print(c-d)
通过率为60%,不知道哪里有问题,哪位路过大佬指点一下。感恩。