IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Python L型组件填图问题(棋盘覆盖问题) -> 正文阅读

[游戏开发]Python L型组件填图问题(棋盘覆盖问题)

L 型组件填图问题

1.问题描述

设 B 是一个 n×n 棋盘,n=2 k,(k=1,2,3,…)。用分治法设计一个算法,使得:用若干个 L 型条块可以覆盖住 B 的除一个特殊方格外的所有方格。其中,一个 L 型条块可以覆盖 3 个 方格。且任意两个 L 型条块不能重叠覆盖棋盘。

例如:如果 n=2,则存在 4 个方格,其中,除一个方格外,其余 3 个方格可被一 L 型条 块覆盖;当 n=4 时,则存在 16 个方格,其中,除一个方格外,其余 15 个方格被 5 个 L 型条 块覆盖。

2. 具体要求

输入一个正整数 n,表示棋盘的大小是 n*n 的。输出一个被 L 型条块覆盖的 n*n 棋盘。 该棋盘除一个方格外,其余各方格都被 L 型条块覆盖住。为区别出各个方格是被哪个 L 型条 块所覆盖,每个 L 型条块用不同的数字或颜色、标记表示。

3. 测试数据

输入:8

输出:


import random;

count = 0 
def initMap(n):
    res = []
    for i in range(n):
        arr = [0] * n  # 大坑
        res.append(arr)
    return res


def fill(src, half, x, y, direction):
    global count
    count += 1
    if direction == 0:
        src[half + x][half + y] = count
        src[half + x - 1][half + y] = count
        src[half + x][half + y - 1] = count

    elif direction == 1:
        src[half + x][half + y] = count
        src[half + x - 1][half + y - 1] = count
        src[half + x - 1][half + y] = count

    elif direction == 2:
        src[half + x][half + y] = count
        src[half + x - 1][half + y - 1] = count
        src[half + x][half + y - 1] = count

    elif direction == 3:   
        src[half + x - 1][half + y - 1] = count
        src[half + x - 1][half + y] = count
        src[half + x][half + y - 1] = count



def splitMap(src, n, par_x, par_y, x, y):
    if n == 1:
        return
    half = n // 2;
    if (x + half) > par_x and (y + half) > par_y:   # 特殊点在左上棋盘
        fill(src, half, x, y, 0)
        splitMap(src, half, par_x, par_y, x, y)
        
        # 除去特殊点所在棋盘的递归外进行剩余棋盘递归
        splitMap(src, half, x + half, y + half - 1, x + half, y)  # 右上
        splitMap(src, half, x + half - 1, y + half, x, y + half)  # 左下
        splitMap(src, half, x + half, y + half, x + half, y + half)  # 右下
    elif (x + half) <= par_x and (y + half) > par_y:  # 特殊点在右上棋盘
        fill(src, half, x, y, 1)
        splitMap(src, half, par_x, par_y, x + half, y)
        
        splitMap(src, half, x + half - 1, y + half - 1, x, y)  #左上
        splitMap(src, half, x + half - 1, y + half, x, y + half)  # 左下
        splitMap(src, half, x + half, y + half, x + half, y + half)  # 右下
    elif (x + half) > par_x and (y + half) <= par_y:  # 特殊点在左下棋盘
        fill(src, half, x, y, 2)
        splitMap(src, half, par_x, par_y, x, y + half)    
        
        splitMap(src, half, x + half - 1, y + half - 1, x, y)  #左上
        splitMap(src, half, x + half, y + half - 1, x + half, y)  # 右上
        splitMap(src, half, x + half, y + half, x + half, y + half)  # 右下
    elif (x + half) <= par_x and (y + half) <= par_y:  # 特殊点在右下棋盘
        fill(src, half, x, y, 3)
        splitMap(src, half, par_x, par_y, x + half, y + half)    
        
        splitMap(src, half, x + half - 1, y + half - 1, x, y)  #左上
        splitMap(src, half, x + half, y + half - 1, x + half, y)  # 右上
        splitMap(src, half, x + half - 1, y + half, x, y + half)  # 左下



def fillMap(n, par_x, par_y):
    src = initMap(n)
    splitMap(src, n, par_x=par_x, par_y=par_y, x=0, y=0)
    return src
    
    
def showMap(res, n):
    print()
    for i in range(n):
        for j in range(n):
            print(res[i][j], end='\t')        
        print()


n = int(input())
x = random.randint(0, n)
y = random.randint(0, n)
res = fillMap(n, par_x=x, par_y=y)
showMap(res, n)

# 1 1 1 1
# 1 0 0 1
# 1 0 0 1
# 1 1 1 1

# 1 1 2 2 0 0 0 0
# 1 4 4 2 0 0 0 0
# 3 4 5 5 0 0 0 0
# 3 3 5 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0
# 0 0 0 0 0 0 0 0

?

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-05-02 13:31:36  更:2022-05-02 13:31:50 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 10:49:43-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码