算法设计与分析 | 分治棋盘

题目
在一个2^k * 2^k个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。  

输入

第一行为k,如题意

第二行为特殊点的坐标x,y

输出
特殊点用0输出,数据间用制表符隔开(‘t’), 要求遍历顺序按从左到右,从上到下。

样例输入

3
2 2

样例输出

3	3	4	4	8	8	9	9	
3	0	2	4	8	7	7	9	
5	2	2	6	10	10	7	11	
5	5	6	6	1	10	11	11	
13	13	14	1	1	18	19	19	
13	12	14	14	18	18	17	19	
15	12	12	16	20	17	17	21	
15	15	16	16	20	20	21	21

分析

该题采用是分治的思想,就是把大问题分解成一个小问题进行解答,比如:8X8的棋盘可以从2X2的棋盘着手,分别有4种L型骨牌:

将 2^k*2^k的棋盘划分为 2^(k−1)∗2^(k−1)这样的子棋盘4块。

递归求解:递归填充各个格子,填充分为四个情况,

(1)如果特殊方块在左上子棋盘,则递归填充左上子棋盘;否则填充左上子棋盘的右下角,将右下角看做特殊方块,然后递归填充左上子棋盘。
(2)如果特殊方块在右上子棋盘,则递归填充右上子棋盘;否则填充右上子棋盘的左下角,将左下角看做特殊方块,然后递归填充右上子棋盘。
(3)如果特殊方块在左下子棋盘,则递归填充左下子棋盘;否则填充左下子棋盘的右上角,将右上角看做特殊方块,然后递归填充左下子棋盘。
(4)如果特殊方块在右下子棋盘,则递归填充右下子棋盘;否则填充右下子棋盘的右下角,将左上角看做特殊方块,然后递归填充右下子棋盘。

递归出口为 k=0也就是子棋盘方格数为1。

注意:这里的样例输入的特殊点坐标(2,2)是以1为起始坐标的,所以得在main函数里面调用ChessBoard(0,0,x-1,y-1,bs),所以就-1。

代码

//分治棋盘
#include <stdio.h>
#include <math.h>
int tile = 1;
int bd[128][128];
void ChessBoard(int tr, int tc, int dr, int dc, int sz) {if (sz == 1) return;int t = tile++;int s = sz / 2;//覆盖左上角子棋盘if (dr < tr + s && dc < tc + s) {ChessBoard(tr, tc, dr, dc, s);//特殊方格在此棋盘中}else {bd[tr + s - 1][tc + s - 1] = t;//用t号L型骨牌覆盖右下角ChessBoard(tr, tc, tr + s - 1, tc + s - 1, s);}//覆盖右上角子棋盘if (dr < tr + s && dc >= tc + s) {ChessBoard(tr, tc + s, dr, dc, s);}else {bd[tr + s - 1][tc + s] = t;//用t号L型骨牌覆盖左下角ChessBoard(tr, tc + s, tr + s - 1, tc + s, s);}//覆盖左下角子棋盘if (dr >= tr + s && dc < tc + s) {ChessBoard(tr + s, tc, dr, dc, s);}else {bd[tr + s][tc + s - 1] = t;//用t号L型骨牌覆盖右上角ChessBoard(tr + s, tc, tr + s, tc + s - 1, s);}//覆盖右下角子棋盘if (dr >= tr + s && dc >= tc + s) {ChessBoard(tr + s, tc + s, dr, dc, s);}else {bd[tr + s][tc + s] = t;//用t号L型骨牌覆盖左上角ChessBoard(tr + s, tc + s, tr + s, tc + s, s);}
}int main() {int n = 0, x = 0, y = 0,i,j;scanf("%d", &n);int bs = pow(2, n);//棋盘长度scanf("%d %d", &x, &y);ChessBoard(0, 0, x-1, y-1, bs);for (i = 0; i < bs; i++) {for (j = 0; j < bs; j++) {printf("%d\t", bd[i][j]);}printf("\n");}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/190977.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解锁OpenAI潜力:OpenAI 全面解析与最佳实践

该项目是由OpenAI公司提供的一个大型代码库&#xff0c;其中包含了各类与OpenAI API相关的代码示例和最佳实践。 此项目名为OpenAI Cookbook&#xff0c;目的是为了帮助使用者更有效地利用OpenAI API&#xff0c;将其应用于自己的工作和生活中。具体来说&#xff0c;可以解决一…

【数字人】7、GeneFace++ | 使用声音驱动的面部运动系数作为 condition 来指导 NeRF 重建说话头

文章目录 一、背景二、相关工作2.1 唇形同步的 audio-to-motion2.2 真实人像渲染 三、方法3.1 对 GeneFace 的继承3.2 GeneFace 的结构3.2.1 Pitch-Aware Audio-to-Motion Transform3.2.2 Landmark Locally Linear Embedding3.2.3 Instant Motion-to-Video Rendering 四、效果 …

二叉树中的深搜之二叉树的所有路径

257. 二叉树的所有路径 - 力扣&#xff08;LeetCode&#xff09; 对于二叉树的深度搜索&#xff0c;要学会从以下三个角度来去看待问题&#xff1a; 1. 全局变量&#xff0c;有时候全局变量会减少参数的个数&#xff0c;简化很多流程&#xff1b; 这道题目&#xff0c;要返回根…

视频怎么做成二维码?在线教学视频码的制作技巧

视频是怎么制作成二维码的呢&#xff1f;现在经常会发现扫描很多的二维码会观看视频内容的情况&#xff0c;这种方式简化视频传递的过程&#xff0c;能够更加简单快捷的在线获取视频内容。对于想要了解视频二维码制作方法的小伙伴&#xff0c;小编通过本篇文章来教大家一招&…

手把手教你用C语言写出“走迷宫”小游戏(能看懂文字就会自己敲系列)

目录 设计迷宫地图 设计主角——小球 完整代码 这次教大家编写一个简单的“走迷宫”小游戏&#xff0c;我们可以通过键盘上的‘W’、‘S’、‘A’、‘D’四个键来控制一个“小球”向上&#xff0c;下&#xff0c;左&#xff0c;右移动&#xff0c;目的就是让这个“小球”从起…

【0基础学Java第十课】-- 认识String类

10. 认识String类 10.1 String类的重要性10.2 常用方法10.2.1 字符串构造10.2.2 String对象的比较10.2.3 字符串查找10.2.4 转化10.2.5 字符串替换10.2.6 字符串拆分10.2.7 字符串截取10.2.8 字符串的不可变性10.2.9 字符串修改 10.3 StringBuilder和StringBuffer10.3.1 String…

制作翻页电子相册,这个工具你必须了解!

电子相册作为一种很有纪念意义的载体&#xff0c;无论是生日、旅行、结婚、毕业纪念等等&#xff0c;可以应用在很多场合当中&#xff0c;如何制作呢&#xff1f; 而对于不会制作电子相册的人来说&#xff0c;使用套用模板是最直接快速的方式了。所以&#xff0c;推荐大家使用…

关于SPJ表的数据库作业

打字不易&#xff0c;且复制且珍惜 建表 use 库名;create table S( --供应商 SNO char(6) not null, SNAME char(10) not null, STATUS INT, CITY char(10), primary key(SNO));create table P( --零件 PNO char(6) not null, PNAME char(12)not null, COLOR char(4), WEIGHT…

小命令,大世界

Linux是一个大系统&#xff0c;功能丰富&#xff0c;好比是一台巨型机器&#xff0c;而命令&#xff0c;就是这台机器的操作台。要想控制好这台机器&#xff0c;用好这台机器&#xff0c;就得会看仪表&#xff0c;会操作各种按钮。《Linux常用命令自学手册》就是介绍如何操作这…

1334. 阈值距离内邻居最少的城市/Floyd 【leetcode】

1334. 阈值距离内邻居最少的城市 有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边&#xff0c;距离阈值是一个整数 distanceThreshold。 返回能通过某些路径…

无重复最长字符串(最长无重复子字符串),剑指offer,力扣

目录 原题&#xff1a; 力扣地址&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 难度算中下吧&#xff0c;这个总体不算很难&#xff0c;而且滑动窗口&#xff0c;以及哈希都比较常见 审题目事例提示&#xff1a; 解题思路&#xff08;…

纯CSS自定义滚动条样式

.my-carousel{height: 474px;overflow-y: auto; } /*正常情况下滑块的样式*/ .my-carousel::-webkit-scrollbar {width: 5px; } .my-carousel::-webkit-scrollbar-thumb {border-radius: 8px;background-color: #ccc; } .my-carousel::-webkit-scrollbar-track {border-radius:…