Polyomino

news/2024/5/19 0:38:29

Polyomino

大致题意

给定一个 4×44×4 的地图,地图上存在三个连通块,每个连通块用 # 连接。

现在你可以将这三个连通块任意平移、旋转到任何位置摆放,但你不可以翻转,问是否能刚好覆盖地图(即三个连通块不能有重合、超出地图或铺不满地图)。

解题思路

因为固定的有三个4X4的方块,所以可以直接暴力模拟,当时写的时候也想到模拟了,但是不知道怎么进行旋转就直接跳过了

 

重点说明一下旋转:

通过画图,很容易可以发现,i,j的旋转得到的是j,4-i+1,由此就可以得到旋转函数

// 旋转矩阵
void swp(int index) {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {t[i][j] = sp[index][i][j];}}for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {sp[index][i][j] = t[4 - j + 1][i];}}
}

  

平移函数

/ 平移矩阵
bool py(int index, int x, int y) {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {if (sp[index][i][j] == '#' &&(x + i > 4 || y + j > 4 || x + i < 1 || y + j < 1)) {return false;}}}return true;
}

  

 所以完整的代码

#include <bits/stdc++.h>using namespace std;char s[4][5][5], sp[4][5][5], pt[4][5][5], t[5][5];
int vis[5][5], t1[4], t2[4];// 旋转矩阵
void swp(int index) {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {t[i][j] = sp[index][i][j];}}for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {sp[index][i][j] = t[4 - j + 1][i];}}
}// 平移矩阵
bool py(int index, int x, int y) {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {if (sp[index][i][j] == '#' &&(x + i > 4 || y + j > 4 || x + i < 1 || y + j < 1)) {return false;}}}return true;
}// 检查矩阵
bool check() {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {if (vis[i][j] != 1) {return false;}}}return true;
}// 求最后的分布情况
void ok() {
//进行初始化for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {vis[i][j] = 0;}}for (int id = 1; id <= 3; id++) {for (int x = 1; x <= 4; x++) {for (int y = 1; y <= 4; y++) {vis[x + t1[id]][y + t2[id]] += pt[id][x][y] == '#';//只找#,其余的不记}}} }// dfs 搜索 void dfs(int x) {
  //表示当前已经枚举完三个4X4方块if (x > 3) {ok();if (check()) {cout << "Yes";exit(0);}return;}
  //对代码进行复刻for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {sp[x][i][j] = s[x][i][j];}}for (int scnt = 1; scnt <= 3; scnt++) { // 枚举旋转次数for (int py1 = -4; py1 <= 4; py1++) { // 行偏移量for (int py2 = -4; py2 <= 4; py2++) { // 列偏移量if (py(x, py1, py2)) {for (int i = 1; i <= 4; i++) {for (int j = 1; j <= 4; j++) {pt[x][i][j] = sp[x][i][j];}}t1[x] = py1, t2[x] = py2;//记录第x个方块的偏移量dfs(x + 1);}}}swp(x);//进行旋转} }int main() {for (int i = 1; i <= 3; i++) {for (int j = 1; j <= 4; j++) {for (int k = 1; k <= 4; k++) {cin >> s[i][j][k];}}}dfs(1);cout << "No";return 0; }

  

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

双向循环链表的增删改查功能

数据结构 双向循环链表 双向循环链表的增删改查 /***************************************************************************************************************** * * file name : DoubleCirLinkedList.c * author : cnzycwp@126.com * data : 2024/04/24 * fu…

Unlink原理和一些手法

Unlink原理和一些手法 ✅简单介绍一下unlink相关的知识 unlink是利用glibc malloc 的内存回收机制造成攻击的,核心就在于当两个free的堆块在物理上相邻时,会将他们合并,并将原来free的堆块在原来的链表中解链,加入新的链表中其目的是把一个双向链表中的空闲块拿出来(例如 …

【vue3入门】-【4】插入html

原始html 双大括号,将会将数据插值为纯文本,而不是html,若想要插入html,则需要使用v-html指令 <template><h3>模版语法</h3><p>{{ tthtml }}</p> <!--会直接将html文本展示出来-->><p v-html="tthtml"></p> …

vue中函数使用、class和style属性、条件渲染、列表渲染、数据的双向绑定、input事件、过滤

【事件指令中的函数使用】1 <!DOCTYPE html>2 <html lang="en">3 <head>4 <meta charset="UTF-8">5 <title>Title</title>6 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js">…

边权并查集之奇偶游戏

题目传送门:https://www.acwing.com/problem/content/241/ //懒得手敲题目先给一下题解: #include<iostream> #include<unordered_map> //这个题目有两个点要想明白,一个是点到根的距离标志着这个点的性质,且在路径压缩的过程中此点不会改变 //第二点就是在出现…

【vue3入门】-【2】文本插值

文本插值 最基本的数据绑定形式是文本插值,它使用的是”Mustache“语法(即双大括号) <script> export default{data(){return{msg:"神奇的语法"}} } //以上为文本插值的固定使用格式 </script><template><h3>模版语法</h3><p>…

Redis 面试知识点

1、Redis缓存数据库一致性采用最终一致性,而不是采用强一致性,强一致性会导致系统吞吐量变差;采用双删除的策略,第二次删除,采用延迟删除;推荐采用,先操作数据库,直接删除缓存的方式;删除失败的情况,采用异步方式,重试操作;读取binlog异步删除,使用开源框架canal,…