算法设计 L型组件填图问题

1. 问题描述
设B是一个n×n棋盘,n=2k,(k=1,2,3,…)。用分治法设计一个算法,使得:用若干个L型条块可以覆盖住B的除一个特殊方格外的所有方格。其中,一个L型条块可以覆盖3个方格。且任意两个L型条块不能重叠覆盖棋盘。
例如:如果n=2,则存在4个方格,其中,除一个方格外,其余3个方格可被一L型条块覆盖;当n=4时,则存在16个方格,其中,除一个方格外,其余15个方格被5个L型条块覆盖。
2. 具体要求
输入一个正整数n,表示棋盘的大小是nn的。输出一个被L型条块覆盖的nn棋盘。该棋盘除一个方格外,其余各方格都被L型条块覆盖住。为区别出各个方格是被哪个L型条块所覆盖,每个L型条块用不同的数字或颜色、标记表示。

代码:

int num = 1;    //表示L的数字/// <summary>
/// 给棋盘上色(填数字)
/// </summary>
/// <param name="x">选定格的x坐标</param>
/// <param name="y">选定格的y坐标</param>
/// <param name="a">棋盘</param>
/// <param name="size">棋盘大小</param>
/// <param name="leftTopX">棋盘左上角x坐标</param>
/// <param name="leftTopY">棋盘左上角y坐标</param>
void color(int x, int y, int** a, int size, int leftTopX, int leftTopY)
{int maxX = leftTopX + size - 1;  //求棋盘最大x下标int maxY = leftTopY + size - 1; //求棋盘最大y下标int midX = (maxX + leftTopX) / 2;   //求棋盘x坐标中值int midY = (maxY + leftTopY) / 2;   //求棋盘y坐标中值if (size == 1){return;}//根据选定格在哪个子棋盘,将其余三个子棋盘在中间的三个L形格子填色//按左上、右上、左下、右下的顺序,一次递归给子棋盘上色if (x <= midX && y <= midY)  //选定格在左上子棋盘{a[midX][midY + 1] = num;a[midX + 1][midY + 1] = num;a[midX + 1][midY] = num;num++;color(x, y, a, size / 2, leftTopX, leftTopY);color(midX, midY + 1, a, size / 2, leftTopX, midY + 1);color(midX + 1, midY, a, size / 2, midX + 1, leftTopY);color(midX + 1, midY + 1, a, size/2, midX + 1, midY + 1);}else if (x <= midX && y > midY)  //选定格在右上子棋盘{a[midX][midY] = num;a[midX + 1][midY] = num;a[midX + 1][midY + 1] = num;num++;color(midX, midY, a, size / 2, leftTopX, leftTopY);color(x, y, a, size / 2, leftTopX, midY + 1);color(midX + 1, midY, a, size / 2, midX + 1, leftTopY);color(midX + 1, midY + 1, a, size / 2, midX + 1, midY + 1);}else if (x > midX && y <= midY)  //选定格在左下子棋盘{a[midX][midY] = num;a[midX][midY + 1] = num;a[midX + 1][midY + 1] = num;num++;color(midX, midY, a, size / 2, leftTopX, leftTopY);color(midX, midY + 1, a, size / 2, leftTopX, midY + 1);color(x, y, a, size / 2, midX + 1, leftTopY);color(midX + 1, midY + 1, a, size / 2, midX + 1, midY + 1);}else if (x > midX && y > midY)    //选定格在右下子棋盘{a[midX][midY + 1] = num;a[midX][midY] = num;a[midX + 1][midY] = num;num++;color(midX, midY, a, size / 2, leftTopX, leftTopY);color(midX, midY + 1, a, size / 2, leftTopX, midY + 1);color(midX + 1, midY, a, size / 2, midX + 1, leftTopY);color(x, y, a, size / 2, midX + 1, midY + 1);}else{cout << "出错" << endl;return;}
}void printOne(int** a, int size)
{for (int i = 0; i < size; i++){for (int j = 0; j < size; j++){cout << "\t" << a[i][j];}cout << endl << endl << endl << endl;}cout << endl;
}void one()
{int n, x, y;cin >> n >> x >> y;int** a = new int* [n];for (int i = 0; i < n; i++){a[i] = new int[n];}a[x][y] = 0;color(x, y, a, n, 0, 0);printOne(a, n);for (int i = 0; i < n; i++){delete[] a[i];}delete[] a;
}

截图:


算法设计 L型组件填图问题相关推荐

  1. 分治法——棋盘覆盖问题/L形组件填图问题(Java实现)

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

  2. 算法设计与分析 实验三 回溯法求解地图填色问题

    回溯法求解地图填色问题 一.实验目的与要求 1.实验基本要求: 2.实验亮点: 二.实验内容与方法 三.实验步骤与过程 1.未优化的回溯: (1)算法描述: (2)编程实现 (3)运行并测试: 2.对 ...

  3. 【图的着色问题】算法设计与分析实验1

    计算机科学与工程学院实验报告 课程名称 算法设计与分析 班级 实验内容 实验1:图的着色问题 指导教师 姓名 重剑DS 学号 实验日期 2022.04.28 一.问题描述,含输入.输出数据内容.格式 ...

  4. CSP 201409-5 拼图问题(给出一个n×m的方格图,现在要用如下L型的积木拼到这个图中......)

    CSP 201409-5 拼图问题 一.题目信息 第一次写博客,有什么疏漏之处,欢迎各位大佬指出<(* ̄▽ ̄*)/ 题目要求 试题编号 201409-5 试题名称 拼图 时间限制 3.0s 试题 ...

  5. 实验四 图的遍历算法设计与实现

    一.实验名称:图的遍历算法设计与实现 二.实验目的: 1.掌握图的深度优先遍历的算法. 2.掌握图的广度优先遍历的算法. 3.实验章节:算法设计与分析 第四章 三.实验内容.实验问题和程序运行结果 第 ...

  6. 分治算法--L型骨牌棋盘覆盖

    L型骨牌棋盘覆盖 题目描述 有一个棋盘,要求用给定的四种骨牌进行覆盖.四种骨牌定义如下:   给定的棋盘中有一个格子不存在,即不需要覆盖的格子. 输入 输入有多个用例,第一个为用例个数n,接下来每个用 ...

  7. python堆叠面积图_06. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图...

    1.基本图表绘制 plt.plot() 图表类别:线形图.柱状图.密度图,以横纵坐标两个维度为主 同时可延展出多种其他图表样式 plt.plot(kind='line', ax=None, figsi ...

  8. Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图

    目录 Matplotlib 2 |折线图| 柱状图| 堆叠图| 面积图| 填图| 饼图| 直方图| 散点图| 极坐标| 图箱型图 1.基本图表绘制 plt.plot() ts.plot() 由Seri ...

  9. 计算机算法设计与分析第五章思维导图知识点总结 ( 初稿 )

    复习链接 计算机算法设计与分析第一章思维导图 计算机算法设计与分析第二章思维导图&&知识点总结 计算机算法设计与分析第三章思维导图&&知识点总结 计算机算法设计与分析第 ...

  10. ZL15轮式装载机变速器设计 z型提升机图 400吨四柱式油压机图 火电厂堆料机CAD图 万能砂带机 移动皮带机 胶带机 电火花线切割机床封箱机 汽车发动机 曲轴零件图 …方案

    火电厂堆料机CAD图 2M5210WA型万能砂带机.exb 卷扬机dwg图纸一套 DSY500-6米移动皮带机(套图18张) 9-26-8D离心风机全套图 630钢丝胶带斗式提升机 4100柴油机曲轴 ...

最新文章

  1. kettle 表输入 显示重复_表输入插件详解
  2. Js~对数组进行分组户数
  3. UIDatePicker 日期/时间选取器(滚轮)—IOS开发
  4. linux qos 软件,linux下QOS:应用篇 - 博客 - 伯乐在线
  5. 计算机网络之网络层:12、网络层设备
  6. java referencequeue_java源代码 Reference和ReferenceQueue分析
  7. java关键字与解释_5.Java基础知识-注释和关键字
  8. C实现NV12转I420
  9. pytorch使用DCN
  10. 通过路由器端口映射实现远程桌面连接
  11. Unity3D 中实现毛笔效果
  12. 糜烂性胃炎吃什么药?
  13. 学习编程先学什么?怎么学习编程?
  14. Spring整合日志框架Log4j2
  15. 如何做一名主程之Unity3D网络游戏服务器架构设计
  16. 机械键盘按键不灵敏怎么办、机械键盘按键坏了怎么办、维修机械键盘
  17. iPhone X用户需要知道的12个隐藏小技巧 条条实用
  18. svn主干删除build.sh重新提交报错“处于冲突状态;请在新增之前标记冲突为已经解决”
  19. 中秋主题html,中秋节创意主题策划方案
  20. EasyConnect服务器启动失败,建议关闭浏览器后重新登录

热门文章

  1. (二)注释(comment)详解
  2. ImportError: cannot import name ‘PILLOW_VERSION‘ from ‘PIL‘ (/home/user8/anaconda3/envs/FCOS/lib/pyt
  3. php导入mib表,导入mib库并获取负载均衡F5的Mib信息
  4. 隐藏桌面上计算机图标不见了怎么办,电脑的快捷图标不见了怎么办
  5. 卡内基梅隆大学计算机专业录取难,跨专业申请卡内基梅隆大学计算机录取
  6. Bezier曲线及其de casteljau算法 matlab实现
  7. 面试题:spring的循环依赖问题以及如何解决
  8. OpenWrt固件刷入及相关实验
  9. 写一个iOS复杂表单的正确姿势
  10. 高端制造业企业信息化解决方案,工业电商平台设备、数据、体系预测性维护