7-20 棋盘覆盖 (10 分)

在一个2k∗2k(k为正整数,k<=10,length=2k)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格(其坐标为a,b,分别代表行坐标号和列坐标号),以及有四种L型骨牌(如下图)。求用若干块这种L型骨牌实现除该特殊点棋盘的全覆盖。(本题要求采用分治算法做)


输入格式:
输入三个数,分别是a,b,length.

输出格式:
输出整个棋盘。其中特殊方格填为0,然后铺棋盘的顺序为:先铺四个子棋盘交界的部分,然后递归的对每个子棋盘按照左上,右上,右下,左下的顺时针顺序铺满棋盘。每一块骨牌中三个方格数字相同,按照顺序标号,即第一块骨牌全标为1,第二块骨牌全标为2,…,以此类推。输出的每个数占4个场宽,右对齐。

输入样例:
1 1 4

表示:特殊格子为(1,1),棋盘有4行4列。

输出样例:
0 2 3 3
2 2 1 3
5 1 1 4
5 5 4 4

提示:先铺三个1,再铺三个2,…,最后铺三个5(即先处理子问题交界的地方,再处理左上,右上,右下,左下的子问题).

#include <bits/stdc++.h>
using namespace std;
int a[1000][1000];
int cnt=1,i,j;
//cnt用来标记是第几个L型
//now_h,now_l 用来标记当前递归中的左上角的坐标
//te_h,te_l 用来标记特殊点的坐标
//size 表示当前坐标的长宽
void f(int now_h,int now_l,int te_h,int te_l,int size){if(size==1){//size=1表示已经最小化了 不能更小了 因此就表示已经全部找完了 return ;}int s=size/2;//不要定义成全局变量 他只生存于当前递归周期 int t=cnt++;//均分成四小部分 按照左上 右上 右下 左下 顺时针顺序查找 if(te_h<now_h+s&&te_l<now_l+s){//左上 f(now_h,now_l,te_h,te_l,s); //按照分治思想 当特殊点就在左上时 继续分成四小部分进行分治 }else{//要是特殊点不在左上部分 那你要把左上部分的右下角变成新的特殊点 用t进行标记 a[now_h+s-1][now_l+s-1]=t;//因为t不是全局变量 下一次递归后t会+1 所以只有相同规模的坐标区间t值会相等//就比方说在size=4的情况下 要是特殊点在左上部分 虽然他会标记之后继续递归 但当左上部分全部找完后 //他会接着去找右上 右下 左下部分 因为size相同 所以他的t肯定相同  这三个t就形成了一个新的L型//因此 在查询过程中 不用考虑他到底是哪个L型 一次递归后他自己就会生成 f(now_h,now_l,now_h+s-1,now_l+s-1,s);// 新的特殊点在当前区间的右下角 }if(te_h<now_h+s&&te_l>=now_l+s){//右上部分 f(now_h,now_l+s,te_h,te_l,s);}else {a[now_h+s-1][now_l+s]=t;f(now_h,now_l+s,now_h+s-1,now_l+s,s);}if(te_h>=now_h+s&&te_l>=now_l+s){//右下部分 f(now_h+s,now_l+s,te_h,te_l,s);}else{a[now_h+s][now_l+s]=t;f(now_h+s,now_l+s,now_h+s,now_l+s,s);}if(te_h>=now_h+s&&te_l<now_l+s){//左下部分 f(now_h+s,now_l,te_h,te_l,s);}else{a[now_h+s][now_l+s-1]=t;f(now_h+s,now_l,now_h+s,now_l+s-1,s);}
}
//每次递归只要确保你的区间左上角的坐标与特殊点的坐标准确即可
int main(){int te_h,te_l,k;//去读初始数据 cin>>te_h>>te_l>>k;f(1,1,te_h,te_l,k);for (i=1;i<=k;i++){for (j=1;j<=k;j++){printf("%4d",a[i][j]);}cout<<endl;}return 0;
}

7-20 棋盘覆盖 (10 分)相关推荐

  1. 7-3 棋盘覆盖 (10 分)(思路加详解)Come baby

    一:题目: 输入格式: 输入三个数,分别是aa,bb,length. 输出格式: 输出整个棋盘.其中特殊方格填为0,然后铺棋盘的顺序为:先铺四个子棋盘交界的部分,然后递归的对每个子棋盘按照左上,右上, ...

  2. 7-2 计算Fibonacci数列的前N(N<=20)项 (10 分)

    7-2 计算Fibonacci数列的前N(N<=20)项 (10 分) 编译器:C++ (g++) 从键盘读入正整数N(N<=20),用动态分配空间的方法计算Fibonacci数列的前N项 ...

  3. 7-7 斐波那契(Fibonacci)数列前20项 (10 分)

    7-7 斐波那契(Fibonacci)数列前20项 (10 分) 输出斐波那契(Fibonacci)数列(1,1,2,3,5,8,13--)的前20项 链接 输出格式: 每个数输出占8列. 输出样例: ...

  4. 棋盘覆盖问题——分治法——代码清晰易懂

    一.运行环境 DevC++ 二.题目描述 棋盘覆盖问题.有一个2^k × 2^k个方格的棋盘,其中恰有一个方格残缺.用下面四种三格板覆盖更大的棋盘. 要求: ①两个三格板不能重叠. ②三格板不能覆盖残 ...

  5. 棋盘覆盖问题-分治法

    什么是棋盘覆盖方法? 我去找其他人的解释,恰恰发现一个矛盾的地方,就是看解释比较难理解,但是看解决棋盘覆盖的过程,就很容易理解什么是棋盘覆盖问题了.所以这里就不解释了,直接给一个解决16*16的棋盘解 ...

  6. 7-6 区间覆盖 (10 分)(思路+详解)Come 宝!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    一:题目 设 x 1 ​ ,x 2 ​ ,-,x n ​ 是实直线上的n个点.用固定长度的闭区间覆盖这n个点,至少需要多少个这样的固定长度闭区间? 输入格式: 第1行有2个正整数n(n<50)和 ...

  7. 代码分析+原理图解——棋盘覆盖问题-分治法

    上算法课时,老师以文字+代码的方式讲了这道题,然而有很多同学反映听的不是太懂, 我们接触事物最直观的就是以图片理解,因此我尝试使用图解法来帮助大家理解. 问题描述:   注意:分治法最核心的一点是:分 ...

  8. 棋盘覆盖-分治法(代码实现)

    这是棋盘覆盖的代码实现,至于原理,请参考我的上一篇博客:棋盘覆盖问题-分治法 实现的效果如下: 或者如下: 其中0表示递归过程中标记的所有奇异点 实现代码如下: //棋盘大小size, 奇异点的坐标( ...

  9. 分治法:快速排序棋盘覆盖

    目标 使用分治法解决快速排序问题 使用分治法解决棋盘覆盖问题 原理 一.快排原理 排序算法在工作中最常用,也是学习很多其他算法的前置知识,例如在运用二分查找算法之前,我们通常需要保证数据是有序的,如果 ...

最新文章

  1. 【JLOI2011】飞行路线
  2. 返回对象1(未调用拷贝构造函数)
  3. python数值运算答案_笨方法学Python 习题3:数字和数学计算
  4. 计算机机房建设目标是什么,计算机机房建设方案计划.doc
  5. 【四】Java流程控制
  6. SQL Server 日志传送
  7. ecplise git修改提交信息_Git提交信息规范化
  8. 伺服驱动器cn1引脚定义_英威腾伺服
  9. Objective-c方法调用流程
  10. Python之线程同步与线程锁
  11. 王朝娱乐H5 游戏源码(cocos creator , pomelo + mongDB)搭建教程
  12. windows bat 批处理脚本编写指南
  13. 字体:等宽字体与比例字体 - Monospaced font Proportional font
  14. 学习...笔记05:时间,空间,时空傅里叶变换的基本技巧、获取自旋波的频谱图和色散图
  15. 【Java---数据结构】栈(Stack)
  16. 区块链编程语言_区块链解决方案开发的编程语言
  17. 【数据库】GaussDB
  18. 汽车软件大战一触即发,诚迈科技如何重构整车“软架构”
  19. LVDS,LVTTL,LVCOMS等常见电平标准
  20. Python(x,y)的下载安装

热门文章

  1. Window环境下的Git+GitHub+jenkins+Tomcat实现自动部署项目并发送构建邮件
  2. 疫情期间,我们应该如何保护好自己的宠物?
  3. b550和x570有什么区别 哪个好
  4. 【Flask】Flask框架简介
  5. 【Visual C++】游戏开发笔记十五 游戏人工智能(一) 运动型游戏AI
  6. 2023广东省职业院校技能大赛大数据技术与应用专业样题
  7. 蓝海创意云丨安捷秀发布功能助您轻松管理制作文件
  8. Java8 Lambda表达式和流操作如何让你的代码变慢5倍
  9. 推荐系统产品与算法深度解析
  10. 大数据与云计算概论5