一个操作系统的实现——笔记4

在2^k*2^k个方格组成的棋盘中,有一个方格被占用,用下图的4种L型骨牌覆盖所有棋盘上的其余所有方格,不能重叠。

代码如下:

def chess(tr,tc,pr,pc,size):
	global mark
	global table
	mark+=1
	count=mark
	if size==1:
		return
	half=size//2
	if pr<tr+half and pc<tc+half:
		chess(tr,tc,pr,pc,half)
	else:
		table[tr+half-1][tc+half-1]=count
		chess(tr,tc,tr+half-1,tc+half-1,half)
	if pr<tr+half and pc>=tc+half:
		chess(tr,tc+half,pr,pc,half)
	else:
		table[tr+half-1][tc+half]=count
		chess(tr,tc+half,tr+half-1,tc+half,half)
	if pr>=tr+half and pc<tc+half:
		chess(tr+half,tc,pr,pc,half)
	else:
		table[tr+half][tc+half-1]=count
		chess(tr+half,tc,tr+half,tc+half-1,half)
	if pr>=tr+half and pc>=tc+half:
		chess(tr+half,tc+half,pr,pc,half)
	else:
		table[tr+half][tc+half]=count
		chess(tr+half,tc+half,tr+half,tc+half,half)

def show(table):
	n=len(table)
	for i in range(n):
		for j in range(n):
			print(table[i][j],end=‘	‘)
		print(‘‘)

mark=0
n=8
table=[[-1 for x in range(n)] for y in range(n)]
chess(0,0,2,2,n)
show(table)

n是棋盘宽度,必须是2^k,本例中n=8,特殊格子在(2,2)位置,如下图所示:

采用分治法每次把棋盘分成4份,如果特殊格子在这个小棋盘中则继续分成4份,如果不在这个小棋盘中就把该小棋盘中靠近中央的那个格子置位,表示L型骨牌的1/3占据此处,每一次递归都会遍历查询4个小棋盘,三个不含有特殊格子的棋盘置位的3个格子正好在大棋盘中央构成一个完整的L型骨牌,依次类推,找到全部覆盖方法。运行结果如下:

转载请注明:转自http://blog.csdn.net/littlethunder/article/details/25288969

一个操作系统的实现——笔记4,布布扣,bubuko.com

时间: 2024-10-13 21:24:39

一个操作系统的实现——笔记4的相关文章

一个操作系统的实现 笔记(一)Windows7下工作环境搭建

本文主要讲述环境搭建. 操作系统: win7 需要的软件有: 1).Bochs    虚拟硬盘/软盘制造工具,也可用来进行系统的调试 2).nasm     汇编编译器 3).UltraEdit         查看二进制文件工具,也可用做汇文本编辑器,编写汇编程序时使用 4).FloppyWriter   硬盘/软盘写入工具 只要能达到目的,可以使用任何你擅长的工具. 安装好以上软件,并配置好环境变量后,按以下步骤操作: 1.用bximage.exe创建img文件 在Bochs安装路径下找到b

《Orange&#39;S:一个操作系统的实现》笔记(一)

感觉自己对于操作系统始终没有一个清楚的概念,尤其最近困扰于实模式.保护模式以及寻址方式等一些概念.转而一想,所有的程序,最终都是操作的计算机资源,需要和操作系统打交道,所以操作系统有必要深入了解一下.最终想要自己动手编写一个简单的版本,上网查.网友对于于渊的<Orange'S:一个操作系统的实现>和<30天自制操作系统>评价挺高的,先选<orange>为学习手册.<30>为参考手册,开始自己的操作系统之旅. 首先是平台的搭建问题,首先因本人编程一般都是在自己

实现一个简陋操作系统的相关笔记日志

2015年 01月 22日 星期四 16:48:52 CST (vi的`:r!`命令真心好用,可将外部命令的执行结果插入文字中来)今天乘着将近两个月的寒假将于渊的<一个操作系统的实现>这本书看一遍,在刚过去的半年里刚开始时看了前两章,但由于看到保护模式那一块时感到困难也没了心情,因此搁置了.现在操作系统原理和计算机组成已粗略学过了,是时候照着这本书实践一下了.$表示当前行被汇编后的地址$$表示一个section的开始被汇编后的地址.BIOS会将引导扇区中的内容加载到内存,起始地址为0000:7

一个操作系统的实现(1)-准备工作

今天开始看<Orange'S:一个操作系统的实现>一书.这里是ubuntu 16.04下开发环境的搭建以及实现一个最小的操作系统(准确地说应该是一个引导扇区). 工欲善其事,必先利其器.自制一个操作系统需要的工具如下: 汇编编译器NASM 虚拟机算计Bochs 软盘绝对扇区读写工具(这里直接使用强大的dd) 现在就来安装这些工具 安装NASM 通过源代码安装,官网下载最新版源代码,当前最新的是nasm-2.12.01版本,下面的内容以此来演示. 个人软件一般安装到/usr/local下,所以压

一个操作系统的实现(4)-认识LDT

看到这里,你应该已经很了解GDT了,如果还不了解GDT.请看这篇文章:一个操作系统的实现(2)-认识保护模式,认识保护模式那篇文章的最后详细介绍了由16位寻址升级到32位寻址而引入的GDT. LDT(Local Descriptor Table):从名字上面就可以看出来它与GDT(Gobal Descriptor Table)的区别.GDT是全局描述符表,LDT是局部描述符表(相对于GDT). 下面仍然是从代码的角度讲解什么是LDT.主要讲解在上一节的基础上增加的代码.在文章的最后会附上所有代码

《ORANGE&#39;S一个操作系统的实现》第7章 TTY与键盘输入的关系。

背景:我感觉这块部分有一些逻辑上的复杂,于是我把它的关系结构画了一张图来表述,并且在图上解答了我自己想到的几个问题. 关系如图所示: <ORANGE'S一个操作系统的实现>第7章 TTY与键盘输入的关系. 原文地址:https://www.cnblogs.com/vizdl/p/12178667.html

《一个操作系统的实现》学习笔记(一) bochs源码安装及配置

前言:本机环境ubuntu 14.04 bochs 2.4.5 一.下载 官网 http://bochs.sourceforge.net/ 二.安装 1.将下载好的压缩包解压并进入该目录 tar vxzf bochs-2.4.5.tar.gz cd bochs-2.4.5 2.安装编译程序依赖的包 sudo apt-get install build-essential 3.检测环境,打开调试功能的开关 ./configure --enable-debugger --enable-disasm

《一个操作系统的实现》读书笔记--第三章---不同特权级代码段之间的跳转

http://blog.csdn.net/begginghard/article/details/7262901 1.特权级 2.一致代码段和非一致代码段 3.DPL.RPL.CPL分别代表的含义,存储在什么位置,以及它们之间的关系 4.不同特权级数据段之间的访问规则 5.不同特权级代码段之间的转移 6.代码段之间的转移对堆栈的影响 7.结合pmtest5.asm来见证不同特权级代码段之间的跳转 一.特权级在IA32的分段机制下,特权级总共有4个特权级别,从高到低分别是0.1.2.3.数字越小表

一个操作系统的实现中jmp dword SelectorCode32:0的理解

; 准备切换到保护模式 mov eax, cr0 or eax, 1 mov cr0, eax ; 真正进入保护模式 jmp dword SelectorCode32:0 ; 执行这一句会把 SelectorCode32 装入 cs, ; 并跳转到 Code32Selector:0 处 这段时间在一个操作系统的实现 好书啊,感谢作者 这两天一直纠结在    ; jmp    dword SelectorCode32:0    ; 这句话,看了些资料,现将自己理解的分享一下,不对的地方,大家指点一