棋盘覆盖问题

百度百科

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

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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 在几次小的近乎不可见的雪下过之后,终于,等来了真正意义上的初雪。 多少人,盼着,二零一七年会有一场初雪。借着初雪的...
    爱吃草莓味的真知棒阅读 274评论 0 0
  • 对年鉴文稿的编辑和审校就是依照年鉴的规范和要求对条目内容进行“加工制作”。条目是以年度事实和资料为主题记载客观事物...
    剑庐阅读 917评论 0 1
  • 花随往事开败 故事的结尾我等不来 轮替远走的色彩 梦未醒来 徒留我在原地彷徊 谁手握执念等待 明知春到檐燕却不会在...
    倾耳听风阅读 269评论 5 9
  • To those who may concern, 上周,我们谈到如何高效的利用上班和下班的时间去经营你的人生。在...
    陪你一起成长的大叔阅读 155评论 0 0