棋盘覆盖问题的算法实现

棋盘覆盖问题 //棋盘覆盖问题 /* (tr,tc)是棋盘左上角的方格坐标 (dr,dc)是特殊方格所在的坐标 size是棋盘的行数和列数 */ #include using namespace std; int board[1025][1025]; static int tile = 1; void ChessBoard(int tr,int tc,int dr,int dc,int size) { 阅读详情
在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

 实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理如图1所示。

棋盘覆盖问题 - 蔷薇阁 - 落落工作室
            图1

 将棋盘保存在一个二维数组中。骨牌号从2开始,特殊方格为1,如果是一个4 * 4的棋盘,特殊方格为(2,2),那么程序的输出为

3   3   4   4   
3   2   2   4   
5   2   1   6   
5   5   6   6


代码实现如下:


#include<stdio.h>
#define MAX 100 
int Board[MAX][MAX]; // 骨盘号码记录
int number = 1;  // L型骨牌号

void ChessBoard(int tr , int tc , int x , int y ,int size) {
	if(size == 1) {
		return;
	}
	int t = ++number;  // 骨盘号自增
	int s = size / 2;  // 分割棋盘
	// 覆盖四分之一左上角子棋盘
	if(x < tr + s && y < tc +s) { // 如果特殊方格在此子棋盘中
		ChessBoard(tr , tc , x , y , s);
	} else {                      // 如果特殊方格不在此子棋盘中
		Board[tr+s-1][tc+s-1] = t; // 覆盖右下角
 		ChessBoard(tr , tc , tr+s-1 , tc+s-1 , s); // 覆盖其余的
	}
	// 覆盖四分之一右上角子棋盘
	if(x < tr + s && y >= tc + s) {
		ChessBoard(tr , tc+s , x , y , s);
	} else {
		Board[tr + s - 1][tc + s] = t;
		ChessBoard(tr , tc+s , tr+s-1 , tc+s , s);
	}
	// 覆盖四分之一左下角子棋盘
	if(x >= tr+s && y < tc+s) {
		ChessBoard(tr+s , tc , x , y , s);		
	} else {
		Board[tr + s][tc + s - 1] = t;
		ChessBoard(tr+s , tc , tr + s , tc + s - 1 , s);	
	}
	// 覆盖四分之一右下角子棋盘
	if(x >= tr+s && y >= tc+s) {
		ChessBoard(tr+s , tc+s , x , y , s);
	} else {
		Board[tr + s][tc + s] = t;
		ChessBoard(tr+s , tc+s , tr + s , tc + s , s);			
	}

}

int main() {
	int size , x , y;
	int i , j;
	printf("请先输入size的尺寸:\n");
	// 方格左上角坐标从(1,1)开始
	scanf("%d",&size);
	printf("输入开始覆盖的点坐标x,y\n");
	scanf("%d %d" , &x , &y);
	Board[x][y] = number;
	ChessBoard(1,1,x,y,size);
	printf("结果为:\n");
	for(i =1;i<=size;i++) {
		for(j=1;j<=size;j++) {
			printf("%2d " , Board[i][j]);
		}
		printf("\n");
	}
	return 0; 
}




棋盘覆盖问题算法分析与实现(递归) *昨天上传的代码,经过再次测试发现有问题,其中对边界、终止条件的判断都有错误。。。→_→,今天重新改正,对之前看过代码的童鞋表示sorry。。。(2017.5.13 16:24)* 阅读详情

相关推荐

棋盘覆盖问题的递归算法实现

问题描述:递归与分治策略算法,用 4 种不同形态的 L 型骨牌覆盖一个给定的特殊棋盘上除特殊方格以外的所有方格,且任何 2 个 L 型骨牌不得重叠覆盖。输入数据由程序运行后的界面中的编辑框中输入游戏规模,特殊方格的位置。将覆盖的结果在窗口中显示出来。 输入输出: 通过键盘输入 k 值和特殊方格位置,输出相应的覆盖方案。输出的形式可以是文本格式,也可以是图形格式。 话不多说,直接上代码,代码如下: ...

loser666666的博客 2475

棋盘覆盖问题 分治

NKOJ 2307 棋盘覆盖问题问题描述 在一个2k x 2k(1<=k<=10)个方格组成的棋盘中,恰有一个方格是黑色的,其他方格都是白色。你的任务是要用图示的由三个方格构成的4种不同形态的L型骨牌覆盖所有的白色方格,且任何一个白色方格不能同时被两次或多个次覆盖。 输入格式 第一行一个整数k,表示棋盘的大小为2k x 2k 第二行是两个整数,代表特殊方格所在行号和列号。

rgnoH的博客 1311

实现棋盘覆盖问题的算法细节

棋盘覆盖问题是一个经典的计算机科学问题,它属于计算几何和算法领域。在这个问题中,我们面对的是一个被分割成若干个更小方格的棋盘,其中一部分方格可能已经失效或被占用。我们的任务是找到一种方法,将剩余未被占用的方格用L型骨牌覆盖,而每张L型骨牌覆盖恰好3个单位方格。这是一个典型的组合优化问题,它在计算机科学和实际应用中都有广泛的用途,比如在集成电路设计中用于减少互连问题。棋盘覆盖问题的解决涉及到搜索和组合策略,特别是在面对较大规模的问题时,需要高效的算法来减少计算量。

weixin_42513928的博客 874

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系:rl命名空间下,主要有八大模块。搞定VS后将逐个拆解。

qq_34839823的博客 1736

四自由度SCARA机器人的运动学和动力学MATLAB建模与仿真

本文介绍了四自由度SCARA机器人的运动学和动力学建模,使用MATLAB进行了相应的建模与仿真。通过正运动学和动力学分析,可以了解机器人在不同状态下的运动特性和力学特性。这为后续的控制算法设计和性能优化打下了基础。希望本教程对学习SCARA机器人有帮助。

小蜗牛的珍贵百宝箱 3636

算法分析 | 分治策略算法设计之棋盘覆盖 C语言版

算法分析 | 分治策略算法设计之棋盘覆盖 C语言版 声明:凡代码问题,欢迎在评论区沟通。承蒙指正,一起成长!

kndjg的博客 3105

基于STM32的智能工业机器人臂控制系统

工业机器人臂是智能制造的核心组件,广泛应用于装配、焊接、搬运等任务。基于STM32微控制器的机器人臂控制系统,通过集成伺服电机驱动、运动规划算法和实时通信功能,实现对多轴机械臂的精确控制与路径规划。本设计通过STM32实现了一套智能工业机器人臂控制系统,集成了高效的运动规划算法和实时控制功能。机器人臂系统根据输入的目标位置(如工件坐标),通过运动学计算生成动作轨迹,利用伺服电机驱动器控制关节运动。该系统广泛应用于工业自动化场景,如汽车制造中的零件装配、电子产品生产中的元件焊接以及物流系统中的物料搬运。

stm32d1219的博客 2567

棋盘覆盖(C语言)

在一个×个方格组成的棋盘中,恰有一个方格与其他方格不 同,称该方格为“特殊方格”,且称该棋盘为“特殊棋盘”,在棋盘覆盖问题中,要用图1所示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 本文采用C语言进行编程,并且相信讲解了编程的思想。易懂。

kaizitian的博客 4944

Wezterm的安装和简单配置

希望 wezterm 的主题配色,保持和 powershell 默认配色一致,也就是 Compell 主题。目的是在频繁使用 wezterm 时,原本的根据颜色判断文件信息(尤其是WSL里的Linux下,文件和目录颜色)依然可以使用。wezterm 默认用 cmd.exe, 我是 win11,希望默认用 powershell。

baiyu33的博客 4263

AutoSAR实战:手把手教你配置PNC(Partial Network Cluster)实现精准休眠与唤醒

本文详细介绍了如何在AutoSAR中配置PNC(Partial Network Cluster)实现精准休眠与唤醒,通过DaVinci Configurator工具逐步指导,结合ComM模块的协同调试,优化车载电子系统的能耗管理。文章包含实战步骤、常见错误排查及功耗优化数据,适合汽车电子开发工程师参考。

weixin_33725239的博客 465

【算法】棋盘覆盖问题:算法与实现

棋盘覆盖问题的典型形式是给定一个的棋盘,要求用的多米诺骨牌完全覆盖该棋盘。为了增加问题的复杂度,棋盘上可能会有一个被占据的格子(即不能被覆盖)。我们的目标是找到一种方法,用尽可能少的多米诺骨牌覆盖整个棋盘,同时满足上述限制条件。棋盘覆盖问题是一个经典的算法问题,通过分治法的应用,我们能够有效地解决该问题。本文不仅介绍了问题的定义、算法思想和具体实现,还探讨了一些变种问题。希望这篇文章可以帮助大家掌握分治法的基本概念,并能在实际问题中灵活应用。

INS_1023的博客 2246

自研SSD固件:从零实现固态硬盘底层存储控制系统

本文探讨了自主开发SSD固件的可行性及实现方案。分析表明,虽然NAND Flash控制协议标准化且存在开源参考实现,但开发仍面临FTL设计复杂度高、性能调优等挑战。推荐采用FPGA平台(如Xilinx Zynq-7000)搭配SLC NAND Flash的方案,预计开发周期9-12个月。系统采用分层架构设计,包含主机接口层、FTL层和闪存接口层,核心模块需实现NAND Flash底层驱动、地址映射管理和垃圾回收等功能。文中提供了关键数据结构和基础驱动代码示例,包括页读写、块擦除等操作。该方案着重解决NAND

电脑管家 1878

分治算法——附棋盘覆盖问题的java代码实现

分治算法基本概念   在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)……    任何一个可以用计算机求解的问题所需的计算时间都与其规模...

likunkun__的博客 8875

Python 中 dpkt 库的详细使用指南(强大的 Python 数据包解析库)

dpkt 是一个功能强大的 Python 网络数据包解析库,支持解析和构造以太网、IP、TCP/UDP 等多种协议的数据包。其核心功能包括解析各层协议头部、读写 pcap 文件、构造自定义数据包及分析 HTTP 流量等。dpkt 提供简单易用的 API,适用于网络分析、安全研究和流量监控场景。优化技巧包括数据包过滤、批量处理和选择性解析以提高性能,常见问题如数据不完整或协议识别错误可通过异常处理和字段验证解决。典型应用场景涵盖协议分析、网络调试和自定义数据包生成。

数据知道的博客 1万+

Claude Code 任务编排 头脑风暴与 疯狂拷问:Superpowers vs Grill-me 硬核对比与工程落地

Superpowers和Grill-me是AI编程中的互补工具:Superpowers提供工程化开发流程(从需求梳理到代码审查),确保规范执行;Grill-me通过持续追问帮助厘清需求,避免方向偏差。两者结合形成"构思-拷问-执行"工作流,前者负责方案生成与落地,后者专注需求审查。根据场景选择:个人项目可用Grill-me快速澄清需求,企业项目推荐Superpowers全流程,复杂开发则建议组合使用。它们分别解决"如何落地"和"是否对齐"的问题,共

十年老程序猿,AI 疯狂研究专家,前沿硬核知识分享 322

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

实现的基本原理是将2^k*2k的棋盘分成四块2(k-1)*2^(k-1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。在一个2^k*2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。...

老男孩的架构路 184

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

棋盘覆盖问题 算法分析和C++实现

/* 棋盘覆盖问题 输入:三个整数:k, i, j k >= 1,表示边长为2^k; 0 <= i <2^k, 表示特殊方格的x坐标; 0 <= j <2^k, 表示特殊方格的y坐标。 从而可以构建一个2^k * 2^k的二维数组A,A[i][j] = 0 表示此处为正常方格,A[i][j] = 1表示此处为特殊方格 A[i][j] = {0, 1}, sum(A) = 1, 即整个二维数组中只有一个位置为1,其余都为0 输出为一个二维数

qq_39427552的博客 1121

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

算法分析与设计实验之 java实现分治法解决棋盘覆盖问题

(3)对上述算法进行时间复杂性分析,并设计实验程序验证分析结果。(3)在用分治法设计算法时,最好使子问题的规模大致相同。(4)分别输出2*2、4*4和8*8棋盘的一个解。(1)深刻理解并掌握分治法的设计思路;(2)提高应用分治法设计算法的技能;(2)分步实现棋盘覆盖问题的算法;(1)掌握分治算法的设计思路;使用分治法求解棋盘覆盖问题。

qq_62159107的博客 508

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

棋盘覆盖问题:递归与分治算法的经典实现

递归与分治是计算机算法中的核心思想,通过将复杂问题分解为相似子问题来高效求解。棋盘覆盖问题作为经典案例,展示了如何用L型骨牌覆盖2^n×2^n棋盘(除一个特殊方格外)。其技术价值在于训练递归思维和空间划分能力,广泛应用于ACM竞赛和算法教学中。本文以C++实现为例,详解分治策略设计、数学归纳证明及工程优化技巧,帮助开发者掌握这一重要算法范式。理解该算法对处理快速傅里叶变换等复杂分治问题具有重要启发意义。

weixin_31240035的博客 241

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

本文实例讲述了Java基于分治算法实现的棋盘覆盖问题。分享给大家供大家参考,具体如下:在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。四个L型骨牌如下图:棋盘中的特殊方格如图:实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特...

weixin_39932300的博客 331

java棋盘覆盖分治法_算法java实现--分治法--棋盘覆盖问题

棋盘覆盖问题的java实现(分治法)具体问题描述以及C/C++实现参见网址http://blog.youkuaiyun.com/liufeng_king/article/details/8477868/*** 棋盘覆盖问题--分治法*/public class Qipanfugai {public int tile = 1;public int[][] board;//整型数组保存棋盘public Qipan...

weixin_34518190的博客 288

分治算法中棋盘覆盖问题(c语言实现)

/*说明:vc6.0编译。《计算机算法设计与分析》第三版题,发上来当自己的笔记。没有注释,见者勿怪!功能:实现棋盘覆盖作者:剑驰时间:2009/10/23*/#define CHESS_BOARD_SIZE 16#includeint tile=1;int Board[CHESS_BOARD_SIZE][CHESS_BOARD_SIZE];void ChessBoard(int

jianchiwhb的专栏 5962
上一篇: Servlet实现的验证码功能
下一篇: 单例/单体模式(Singleton)
java_wliang
博客等级 码龄15年 19粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值