当前位置: 首页 > news >正文

题解:洛谷 P1228 地毯填补问题

【题目来源】

洛谷:P1228 地毯填补问题 - 洛谷 (luogu.com.cn)

【题目描述】

相传在一个古老的阿拉伯国家里,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如图):

image

并且每一方格只能用一层地毯,迷宫的大小为 \(2^k\times2^k\) 的方形。当然,也不能让公主无限制的在那儿等,对吧?由于你使用的是计算机,所以实现时间为 \(1\) 秒。

【输入】

输入文件共 \(2\) 行。

第一行一个整数 k,即给定被填补迷宫的大小为 \(2^k\times 2^k(0\lt k\le10)\); 第二行两个整数 \(x,y\),即给出公主所在方格的坐标(\(x\) 为行坐标,\(y\) 为列坐标),\(x\)\(y\) 之间有一个空格隔开。

【输出】

将迷宫填补完整的方案:每一补(行)为 \(x\ y\ c\)\(x,y\) 为毯子拐角的行坐标和列坐标,\(c\) 为使用毯子的形状,具体见上面的图 \(1\),毯子形状分别用 \(1,2,3,4\) 表示,\(x,y,c\) 之间用一个空格隔开)。

【输入样例】

3                    
3 3   

【输出样例】

5 5 1
2 2 4
1 1 4
1 4 3
4 1 2
4 4 1
2 7 3
1 5 4
1 8 3
3 6 3
4 8 1
7 2 2
5 1 4
6 3 2
8 1 2
8 4 1
7 7 1
6 6 1
5 8 3
8 5 2
8 8 1

【解题思路】

image

【算法标签】

《洛谷 P1228 地毯填补问题》 #递归# #分治# #Special judge#

【代码详解】

#include <bits/stdc++.h>
using namespace std;// 递归函数,用于填充棋盘
// (x,y): 当前棋盘区域的左上角坐标
// (gx,gy): 特殊方格的坐标
// l: 当前棋盘区域的边长
void f(int x, int y, int gx, int gy, int l) 
{// 基本情况:棋盘大小为1时直接返回if (l == 1) return;// 情况1:特殊方格在左上象限if (gx <= x + l/2 - 1 && gy <= y + l/2 - 1) {// 在中心位置放置L型骨牌(类型1)cout << x + l/2 << " " << y + l/2 << " " << 1 << endl;// 递归处理四个子区域f(x, y, gx, gy, l/2);                          // 左上f(x, y + l/2, x + l/2 - 1, y + l/2, l/2);      // 右上f(x + l/2, y, x + l/2, y + l/2 - 1, l/2);      // 左下f(x + l/2, y + l/2, x + l/2, y + l/2, l/2);    // 右下}// 情况2:特殊方格在右上象限else if (gx <= x + l/2 - 1 && gy >= y + l/2) {// 在中心位置放置L型骨牌(类型2)cout << x + l/2 << " " << y + l/2 - 1 << " " << 2 << endl;f(x, y, x + l/2 - 1, y + l/2 - 1, l/2);        // 左上f(x, y + l/2, gx, gy, l/2);                    // 右上f(x + l/2, y, x + l/2, y + l/2 - 1, l/2);      // 左下f(x + l/2, y + l/2, x + l/2, y + l/2, l/2);    // 右下}// 情况3:特殊方格在左下象限else if (gx >= x + l/2 && gy <= y + l/2 - 1) {// 在中心位置放置L型骨牌(类型3)cout << x + l/2 - 1 << " " << y + l/2 << " " << 3 << endl;f(x, y, x + l/2 - 1, y + l/2 - 1, l/2);        // 左上f(x, y + l/2, x + l/2 - 1, y + l/2, l/2);      // 右上f(x + l/2, y, gx, gy, l/2);                    // 左下f(x + l/2, y + l/2, x + l/2, y + l/2, l/2);    // 右下}// 情况4:特殊方格在右下象限else if (gx >= x + l/2 && gy >= y + l/2) {// 在中心位置放置L型骨牌(类型4)cout << x + l/2 - 1 << " " << y + l/2 - 1 << " " << 4 << endl;f(x, y, x + l/2 - 1, y + l/2 - 1, l/2);        // 左上f(x, y + l/2, x + l/2 - 1, y + l/2, l/2);      // 右上f(x + l/2, y, x + l/2, y + l/2 - 1, l/2);      // 左下f(x + l/2, y + l/2, gx, gy, l/2);              // 右下}
}int main() 
{int k, x, y;  // k: 棋盘大小为2^k × 2^k, (x,y): 特殊方格坐标cin >> k >> x >> y;// 调用递归函数,从(1,1)开始,棋盘大小为2^kf(1, 1, x, y, pow(2, k));return 0;
}

【运行结果】

3
3 3
5 5 1
2 2 4
1 1 4
1 4 3
4 1 2
4 4 1
2 7 3
1 5 4
1 8 3
3 6 3
4 8 1
7 2 2
5 1 4
6 3 2
8 1 2
8 4 1
7 7 1
6 6 1
5 8 3
8 5 2
8 8 1
http://www.jsqmd.com/news/389954/

相关文章:

  • 探索CNN - BILSTM - Attention多特征分类预测:Matlab实现与分析
  • 实测才敢推!更贴合研究生需求的降AIGC软件 千笔·专业降AI率智能体 VS 灵感风暴AI
  • 真的太省时间! 降AIGC工具 千笔·专业降AI率智能体 VS 学术猹 本科生专属
  • 题解:洛谷 P1990 覆盖墙壁
  • 写作小白救星:AI论文工具 千笔AI VS Checkjie,专科生专属神器!
  • 生产环境【Kotlin系列15】多平台开发实战:一次编写,多端运行最佳实践与性能优化
  • 关闭Edge浏览器的“两指在触控板上往左滑是后退;往右划是前进”
  • 【日语学习-日语知识点小记-日本語体系構造-JLPT-N2前期阶段-第一阶段(13):単語文法】
  • 题解:洛谷 P2437 蜜蜂路线
  • 题解:洛谷 P1928 外星密码
  • 题解:洛谷 P1164 小A点菜
  • 深入解析:Hologres Dynamic Table 在淘天价格力的业务实践
  • 题解:洛谷 P1464 Function
  • 标准 Hough 变换、修正 Hough 变换和序列 Hough 变换三种典型航迹起始算法研究附Matlab代码
  • 交稿前一晚!8个降AIGC工具测评:自考降AI率必备攻略
  • 差分进化算法(DE)与缩放因子自适应差分进化(SHADE)在CEC2005函数寻优中的性能研究附Matlab代码
  • 这次终于选对!8个AI论文平台测评:本科生毕业论文写作必备工具推荐
  • WOA-SVM时序预测模型研究——基于鲸鱼优化算法的支持向量机时序预测方法附Matlab代码
  • 表贴式PMSM的直接转矩控制(DTC)仿真模型附Simulink仿真
  • 比较CVaR最优投资组合与均值-方差投资组合以及其他模型,包括全局最小方差(GMVP)和市场投资组合附Matlab代码
  • 这次终于选对!8个一键生成论文工具:自考毕业论文+开题报告高效写作测评
  • 题解:洛谷 P1028 [NOIP 2001 普及组] 数的计算
  • 2026年IEEE IOTJ SCI2区TOP,面向关键节点感知的灾害区域无人机集群路径规划,深度解析+性能实测
  • 2026年上班族香港优才靠谱品牌指南:从政策落地到全周期服务对比 - 速递信息
  • 采用单极表面电荷密度方法数值计算长且均匀磁化圆柱体极尖间气隙的磁场,并与类似点磁单极的近似方法进行比较附Matlab代码
  • 题解:洛谷 P1044 [NOIP 2003 普及组] 栈
  • 超级创新【物流中心选址】基于企鹅优化算法在物流中心选址的应用附Matlab代码
  • 新手也能上手 10个降AI率软件降AIGC网站:继续教育必备工具深度测评与推荐
  • 救命神器 10个AI论文写作软件测评:专科生毕业论文+开题报告高效写作指南
  • 探索三相交错并联Buck电路双闭环控制的MATLAB/Simulink仿真之旅