pta铺地砖c++

2023-11-06 10:50
文章标签 c++ pta 铺地砖

本文主要是介绍pta铺地砖c++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

7-1 铺地砖

分数 100

全屏浏览题目

切换布局

作者 李强

单位 滨州学院

这个思路没有使用边长size,二分,而是以坐标为主。

有一个游泳池底,划分成了2n×2n(其中n是不超过10的正整数)的网格,每一小格都是正方形,其中有一小格是排水口。

下图展示了当n=4时,在坐标(11,11)上有一个排水口的情景。

现允许用4种形状(大小为2×2但是缺1×1的一角,如果考虑旋转和反转,实质上是同一种)的地砖进行铺设,要求排水口不能被覆盖,其他小格恰被一块地砖覆盖。

type.png

请输出铺设方案。

输入格式:

一行由空格隔开的3个数字n,x,y,其中n如上述题面所示,x,y表示排水孔所在的坐标。1≤n≤10,1≤x≤2n,1≤y≤2n

输出格式:

多行输出。

每块地砖占一行,由7个整数tx1​y1​x2​y2​x3​y3​构成,其中t是地砖的类型编号(1∼4),xi​yi​是各类型地砖对应位置覆盖的小格坐标。

所有数字由1个空格隔开,行首行尾不要有多余的空格。

num.png

输出任意一种合法的顺序即可。

例如,对于上述24×24的网格最右上角如果用类型2的地砖进行铺设,覆盖其中3个小格子,则输出2 1 16 1 15 2 16。表示类型2的地砖,①覆盖最右上角的坐标为(1, 16)的小格,自然地,②、③ 分别覆盖(1, 15)(2, 16)

输入样例:

1 2 2

输出样例:

1 1 1 1 2 2 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

代码如下

#include <iostream>
using namespace std;
// 创建二维数组
int array[1025][1025] = {0};int recursion(int x1, int y1, int x4, int y4, int kx, int ky)
{// 如果是最小的小块1*1的就结束// 通过坐标确定if (y1 == y4 && x1 == x4)return 0;// 不是最小的,划分为四部分,并标记没有排水口的三部分离中心点最近的小格int c = (x4 + x1) / 2, d = (y4 + y1) / 2; // 取中心左上坐标// 1.标记点在左上if (kx <= c && ky <= d) // 通过坐标确定排水口的位置{// 判断类型写入其类型数字// 根据排水口位置确定离中心近的三个小格的类型array[c][d + 1] = 3, array[c + 1][d] = 3, array[c + 1][d + 1] = 3;// 划分成四个块并传入该块标记点recursion(x1, y1, c, d, kx, ky);recursion(x1, d + 1, c, y4, c, d + 1);recursion(c + 1, y1, x4, d, c + 1, d);recursion(c + 1, d + 1, x4, y4, c + 1, d + 1);}// 2.标记点在右上else if (kx <= c && ky > d){array[c][d] = 4, array[c + 1][d] = 4, array[c + 1][d + 1] = 4;recursion(x1, y1, c, d, c, d);recursion(x1, d + 1, c, y4, kx, ky);recursion(c + 1, y1, x4, d, c + 1, d);recursion(c + 1, d + 1, x4, y4, c + 1, d + 1);}// 3.出水口在左下else if (kx > c && ky <= d){array[c][d] = 2, array[c][d + 1] = 2, array[c + 1][d + 1] = 2;recursion(x1, y1, c, d, c, d);recursion(x1, d + 1, c, y4, c, d + 1);recursion(c + 1, y1, x4, d, kx, ky);recursion(c + 1, d + 1, x4, y4, c + 1, d + 1);}// 4.出水口在右下else if (kx > c && ky > d){array[c][d] = 1, array[c][d + 1] = 1, array[c + 1][d] = 1;recursion(x1, y1, c, d, c, d);recursion(x1, d + 1, c, y4, c, d + 1);recursion(c + 1, y1, x4, d, c + 1, d);recursion(c + 1, d + 1, x4, y4, kx, ky);}return 0;// 划分成四块
}int output(int i, int j)
{if (array[i][j] == 1){// 按此类型顺序输出即可// i,j是此类型最左边里的最上边的printf("1 %d %d %d %d %d %d\n", i, j, i, j + 1, i + 1, j);// 输出完此类型归零,防止2次输出array[i][j] = 0, array[i][j + 1] = 0, array[i + 1][j] = 0;}if (array[i][j] == 2){printf("2 %d %d %d %d %d %d\n", i, j + 1, i, j, i + 1, j + 1), array[i][j + 1] = 0, array[i][j] = 0, array[i + 1][j + 1] = 0;}if (array[i][j] == 3){printf("3 %d %d %d %d %d %d\n", i + 1, j, i + 1, j - 1, i, j), array[i][j] = 0, array[i + 1][j - 1] = 0, array[i + 1][j] = 0;}if (array[i][j] == 4){printf("4 %d %d %d %d %d %d\n", i + 1, j, i + 1, j + 1, i, j), array[i][j] = 0, array[i + 1][j + 1] = 0, array[i + 1][j] = 0;}return 0;
}int main()
{int n, kx, ky;int x4 = 1, y4 = 1;cin >> n >> kx >> ky;for (int i = 0; i < n; i++)x4 *= 2;y4 = x4;            // 初始化地图右下角坐标array[kx][ky] = -1; // 进行标记// 递归调用recursion(1, 1, x4, y4, kx, ky); // 左上坐标(x1,y1),右下坐标(x4,y4),标记点坐标(x,y)// 输出for (int i = 1; i <= x4; i++){for (int j = 1; j <= y4; j++){// 从第一行有序输出,最先输出到的一定是此类型最左边的// 如果最左边有两个就是其中最上边的if (array[i][j] != 0)output(i, j);}}return 0;
}

这篇关于pta铺地砖c++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/356171

相关文章

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

从入门到精通C++11 <chrono> 库特性

《从入门到精通C++11<chrono>库特性》chrono库是C++11中一个非常强大和实用的库,它为时间处理提供了丰富的功能和类型安全的接口,通过本文的介绍,我们了解了chrono库的基本概念... 目录一、引言1.1 为什么需要<chrono>库1.2<chrono>库的基本概念二、时间段(Durat

C++20管道运算符的实现示例

《C++20管道运算符的实现示例》本文简要介绍C++20管道运算符的使用与实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录标准库的管道运算符使用自己实现类似的管道运算符我们不打算介绍太多,因为它实际属于c++20最为重要的