消消乐 笔试 python

消消乐代码 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%,不知道哪里有问题,哪位路过大佬指点一下。感恩。

猜你喜欢

转载自blog.csdn.net/qq_40840633/article/details/102490272
今日推荐