美文网首页
棋盘覆盖问题

棋盘覆盖问题

作者: 何大炮 | 来源:发表于2018-05-01 09:08 被阅读0次
百度百科

这个题要用到分治递归的技巧:
分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊方格,从而将原问题分解为规模较小的棋盘覆盖问题。

Idea: 每次对方块进行田字格划分,然后都取方块中心的四个点,其中一个点所在的大方格里存在特殊方格,于是我们保持不动;剩下三个用L型方块占领。

要注意这里除了递归栈,其他的空间复杂度是O(1)。所以没有额外的申请空间,都是基于原table在操作。

时间复杂度:O(4^n)

# 棋盘覆盖

def form_2d_table(length, x, y):
    table= []
    for i in range(0, length):
        row = []
        for j in range(0, length):
            row.append('a')
        table.append(row)
    table[x][y] = 'b'

    return table


def divide(table, table_x, table_y, size, x, y):
    if size == 1:
        return

    global L_num
    mid = size//2
    x_mid = table_x + mid -1
    y_mid = table_y + mid -1


    if x > x_mid and y > y_mid:
        table[x_mid][y_mid] = L_num
        table[x_mid+1][y_mid] = L_num
        table[x_mid][y_mid+1] = L_num
        L_num += 1
        divide(table, table_x+mid, table_y + mid, mid, x, y)
        divide(table, table_x, table_y, mid, table_x + mid-1, table_y+mid-1)
        divide(table, table_x, table_y + mid, mid, table_x+mid-1, table_y+mid)
        divide(table, table_x + mid, table_y, mid, table_x+mid, table_y+mid-1)
      

    if x > x_mid and y <= y_mid:
        table[x_mid][y_mid] = L_num
        table[x_mid][y_mid + 1] = L_num
        table[x_mid + 1][y_mid + 1] = L_num
        L_num += 1

        divide(table, table_x, table_y, mid, table_x+mid-1, table_y+mid-1)
        divide(table, table_x, table_y+mid, mid, table_x+mid-1, table_y+mid)
        divide(table, table_x + mid, table_y, mid, x, y)
        divide(table, table_x+mid, table_y+mid, mid, table_x+mid, table_y+mid)

    if x <= x_mid and y > y_mid:
        table[x_mid][y_mid] = L_num
        table[x_mid + 1][y_mid] = L_num
        table[x_mid + 1][y_mid + 1] = L_num
        L_num += 1

        divide(table, table_x, table_y, mid, table_x + mid - 1, table_y + mid - 1)
        divide(table, table_x, table_y + mid, mid, x, y)
        divide(table, table_x + mid, table_y, mid, table_x + mid, table_y + mid - 1)
        divide(table, table_x + mid, table_y + mid, mid, table_x + mid, table_y + mid)

    if x <= x_mid and y <= y_mid:
        table[x_mid+1][y_mid+1] = L_num
        table[x_mid + 1][y_mid] = L_num
        table[x_mid][y_mid + 1] = L_num
        L_num += 1

        divide(table, table_x, table_y, mid, x, y)
        divide(table, table_x, table_y + mid, mid, table_x + mid-1, table_y + mid)
        divide(table, table_x + mid, table_y, mid, table_x + mid, table_y + mid-1)
        divide(table, table_x + mid, table_y + mid, mid, table_x + mid, table_y + mid)

size = 8
table = form_2d_table(size, 0, 0)

L_num = 0
divide(table, 0, 0, size, 0, 0)

for i in range(size):
    row = []
    for j in range(size):
        row.append(table[i][j])
    print(row)

相关文章

  • 棋盘覆盖问题

    这个题要用到分治和递归的技巧:分治的技巧在于如何划分棋盘,使划分后的子棋盘的大小相同,并且每个子棋盘均包含一个特殊...

  • 棋盘覆盖问题

    Tags: 算法 棋盘覆盖问题 【问题描述】 在一个2^k×2^k个方格组成的棋盘中,若有一个方格与其他方格不同,...

  • Java基于分治算法实现的棋盘覆盖问题示例

    Java基于分治算法实现的棋盘覆盖问题示例 本文主要介绍了ava基于分治算法实现的棋盘覆盖问题,简单描述了棋盘覆盖...

  • 棋盘覆盖问题----分治法

    参考blog 棋盘覆盖问题 问题描述 在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以...

  • 棋盘覆盖问题(C++)

  • 棋盘覆盖

    题目描述:如下图 思路如下路 图展示跟清晰一些 根据伪代码做出实际的编码: 添加一个main 函数 测试上...

  • 棋盘覆盖(递归)

    原创 棋盘覆盖问题 算法设计思想: 因为棋盘大小是大小,所以可以进行四等分,即分成左上,右上,左下,右下四个区,而...

  • 棋盘的多米诺覆盖方法数计算(C++实现)

    问题介绍 棋盘的完美覆盖又称多米诺覆盖(Domino Tiling),是组合数学中一个颇有趣味的问题。首先介绍与该...

  • 递归与分治

    1| 棋盘覆盖问题 || 在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格...

  • 稳定/免分割线多米诺骨牌的棋盘覆盖问题

    前言 多米诺骨牌的棋盘覆盖问题是一类经典的数学/算法问题。本文讨论添加了免分割线约束条件的多米诺骨牌覆盖问题。 问...

网友评论

      本文标题:棋盘覆盖问题

      本文链接:https://www.haomeiwen.com/subject/vekxrftx.html