京东笔试编程题之消消乐

题目:有一个5*5的正方形网格,没个格子中有一个大于0且小于4的整数,对于一个确定的局面,若一个格子与它上下左右四个方向的某个格子(如果存在)数字相同,则称这两个格子是连通的,并且这种连通具有传递性。
每次,可以选择一个格子,若与这个格子连通的格子(包括自己)数大于等于3,你就可以选择消掉这个格子,与此同时,与这个格子连通的所有格子会一起消失。
如果仅仅是这样,那就太简单了,因为无论如何消除,最后的结果都是一样的,所以我们引入重力系统,每次选择消掉某个格子,并将与那个格子相连通的所有格子都消掉后将会有一些格子失去支撑,此时那些格子就会因重力而下落。
京东笔试编程题之消消乐_第1张图片
实现代码如下:

#广度优先搜索,队列实现
def findSame(arr, book, i, j, queue, front, rear, count):
    #保证当前点不为0
    if arr[i][j] == 0:
        return
    
    #当前节点入队
    queue.append([i, j])
    rear[0] = rear[0] + 1
    
    #队列不为空时
    while(front[0] != rear[0]):
        #先出队
        i, j = queue[front[0]]
        front[0] = front[0] + 1
        
        #标记当前正在访问的点
        book[i][j] = 1
        
        #相同的点数量增加
        count[0] = count[0] + 1
        
        #上右下左查找与当前位置相同的项,注意,顺序必须是上右下左
        if (i-1 >= 0) and (arr[i][j] == arr[i-1][j]) and (book[i-1][j] == 0): 
            #如果(i,j)点上方存在点,并且该点值等于当前点的值,而且改点没有被访问过,该点入队
            queue.append([i-1, j])
            rear[0] = rear[0] + 1
        if (j+1 <= 4) and (arr[i][j] == arr[i][j+1]) and (book[i][j+1] == 0):
            queue.append([i, j+1])
            rear[0] = rear[0] + 1
        if (i+1 <= 4) and (arr[i][j] == arr[i+1][j]) and (book[i+1][j] == 0): 
            queue.append([i+1, j])
            rear[0] = rear[0] + 1
        if (j-1 >= 0) and (arr[i][j] == arr[i][j-1]) and (book[i][j-1] == 0): 
            queue.append([i, j-1])
            rear[0] = rear[0] + 1
    
def initBook(book):
    for i in range(5):
        for j in range(5):
            book[i][j] = 0

def fall(arr, book):
    #根据book记录的值,把arr里的值改为0,然后下降
    for i in range(5):
        for j in range(5):
            if book[i][j] == 1:
                arr[i][j] = 0
    
    for j in range(0, 5):
    #对每一列
        for i in range(4, 0, -1): #从4到1, 检查有没有为0的(有没有下降的)
        #每一行
            time = 0 #计算下移次数
            #只要当前点为0,就一直下移。当下移次数time等于行数时,break跳出循环,不然就会无限循环,因为arr[i][j]有可能一直为0
            while(arr[i][j] == 0):
                if time == 5:
                    break
                #把j列0,...,i-1个元素下移
                for k in range(i-1, -1, -1):
                    arr[k+1][j] = arr[k][j]
                arr[0][j] = 0 #每下移一次,都要把最上面的元素换成0
                time = time + 1

arr = []
book = []
for _ in range(5):
    data = input().split(' ') #按行输入
    arr.append(data)
    
    #初始化book数组
    bookTemp = []
    for _ in range(5):
        bookTemp.append(0)
    book.append(bookTemp)

queue = []
front = [0]
rear = [0]
for i in range(5):
    for j in range(5):
        initBook(book) #每次都初始化book
        count = [0]
        findSame(arr, book, i, j, queue, front, rear, count)
        if count[0] >= 3:
            fall(arr, book) #每消一次就下降
            print(arr)
            #print(book)
            print()
    

你可能感兴趣的:(京东笔试编程题之消消乐)