目录

PuzzleBlocks

Egypt

Greece

平铺楼梯区域


PuzzleBlocks

Steam游戏,把异形块拼接成指定图形,可以旋转不能翻转。

Egypt

(9)

(14)

(15)

(18)

(20)

(21)

(24)

(27)

(28)

(30)

Greece

付费解锁

平铺楼梯区域

出自算法谜题:

代码:


#include<iostream>
#include<vector>
#include <iomanip>
using namespace std;vector<vector<int>> v66 =
{  { 1, 0, 0, 0, 0, 0},{ 1, 1, 0, 0, 0, 0},{ 6, 6, 2, 0, 0, 0},{ 6, 5, 2, 2, 0, 0},{ 7, 5, 5, 4, 3, 0},{ 7, 7, 4, 4, 3, 3}
};
vector<vector<int>> v99 =
{
{1, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, },
{ 5, 5, 2, 0, 0, 0, 0, 0, 0, },
{ 6, 5, 2, 2, 0, 0, 0, 0, 0, },
{ 6, 6, 4, 4, 3, 0, 0, 0, 0, },
{ 8, 7, 7, 4, 3, 3, 0, 0, 0, },
{ 8, 8, 7, 12, 12, 10, 10, 0, 0, },
{ 15, 14, 14, 13, 12, 11, 10, 9, 0, },
{ 15, 15, 14, 13, 13, 11, 11, 9, 9, },
};
vector<vector<int>> v62 =
{  { 1, 1},{ 1, 2},{ 2, 2},{ 3, 3},{ 3, 4},{ 4, 4}
};
vector<vector<int>> v92 =
{ { 1, 1},{ 1, 2},{ 2, 2},{ 3, 3},{ 3, 4},{ 4, 4},{ 5, 5},{ 5, 6},{ 6, 6}
};
vector<vector<int>> v22 =
{  { 1, 0},{ 1, 1}
};
vector<vector<int>> v32 =
{  { 1, 2, 2},{ 1, 1, 2}
};void addn(vector<vector<int>> &v, int n)
{for (auto& vi : v) {for (auto& vj : vi)if (vj)vj += n;}
}
int calNum(int n)
{return (n + 1) * n / 6;
}
//2个vector拼接起来
template<typename T>
vector<T> join(vector<T>& v1, vector<T>& v2)
{vector<T>ans(v1.size() + v2.size());copy(v1.begin(), v1.end(), ans.begin());copy(v2.begin(), v2.end(), ans.begin() + v1.size());return ans;
}
template<typename T>
vector<vector<T>> join2(vector<vector<T>>& v1, vector<vector<T>>& v2)
{vector<vector<T>>ans;ans.resize(v1.size());for (int i = 0; i < v1.size(); i++)ans[i] = join(v1[i], v2[i]);return ans;
}bool getNum(int n, vector<vector<int>>&v)
{if (n < 2 || n>30)return false;if (n % 3 == 1)return false;if (n % 3 == 0) {if (n == 3)return false;if (n == 6)v = v66;else if (n == 9)v = v99;else if (n % 6 == 0) {getNum(n - 6, v);for (int i = 0; i < n-6; i++)for (int j = 0; j < 6; j++)v[i].push_back(0);vector<vector<int>>vd;vd.resize(6);int k = calNum(n - 6);for (int i = 0; i < (n-6)/2; i++) {vector<vector<int>> v62tmp = v62;addn(v62tmp, k);k += 6 * 2 / 3;vd = join2(vd, v62tmp);}vector<vector<int>> v66tmp = v66;addn(v66tmp, k);vd = join2(vd, v66tmp);v = join(v, vd);}else {getNum(n - 9, v);for (int i = 0; i < n - 9; i++)for (int j = 0; j < 9; j++)v[i].push_back(0);vector<vector<int>>vd;vd.resize(9);int k = calNum(n - 9);for (int i = 0; i < (n - 9) / 2; i++) {vector<vector<int>> v92tmp = v92;addn(v92tmp, k);k += 9 * 2 / 3;vd = join2(vd, v92tmp);}vector<vector<int>> v99tmp = v99;addn(v99tmp, k);vd = join2(vd, v99tmp);v = join(v, vd);}}else {if (n == 2)v = v22;else {getNum(n - 2, v);for (int i = 0; i < n - 2; i++)for (int j = 0; j < 2; j++)v[i].push_back(0);vector<vector<int>>vd;vd.resize(2);int k = calNum(n - 2);for (int i = 0; i < (n - 2) / 3; i++) {vector<vector<int>> v32tmp = v32;addn(v32tmp, k);k += 3 * 2 / 3;vd = join2(vd, v32tmp);}vector<vector<int>> v22tmp = v22;addn(v22tmp, k);vd = join2(vd, v22tmp);v = join(v, vd);}}
}#define CIN(x) while (!(cin >> x)) { \cin.clear();      \cin.ignore();     \}
#define CIN2(x, y) CIN(x)CIN(y)
#define CIN3(x, y, z) CIN(x)CIN(y)CIN(z)int main()
{vector<vector<int>> v;getNum(24,v);for (int i = 0; i < v.size(); i++) {for (int j = 0; j < v.size(); j++)cout << setw(2)<< v[i][j] << " ";cout << endl;}return 0;
}

优化后代码:

#include<iostream>
#include<vector>
#include <iomanip>
using namespace std;void addn(vector<vector<int>> &v, int n)
{for (auto& vi : v) {for (auto& vj : vi)if (vj)vj += n;}
}
int calNum(int n)
{return (n + 1) * n / 6;
}
//2个vector拼接起来
template<typename T>
vector<T> join(vector<T>& v1, vector<T>& v2)
{vector<T>ans(v1.size() + v2.size());copy(v1.begin(), v1.end(), ans.begin());copy(v2.begin(), v2.end(), ans.begin() + v1.size());return ans;
}
template<typename T>
vector<vector<T>> join2(vector<vector<T>>& v1, vector<vector<T>>& v2)
{vector<vector<T>>ans;ans.resize(v1.size());for (int i = 0; i < v1.size(); i++)ans[i] = join(v1[i], v2[i]);return ans;
}vector<vector<int>> v66 =
{ { 1, 0, 0, 0, 0, 0},{ 1, 1, 0, 0, 0, 0},{ 6, 6, 2, 0, 0, 0},{ 6, 5, 2, 2, 0, 0},{ 7, 5, 5, 4, 3, 0},{ 7, 7, 4, 4, 3, 3}
};
vector<vector<int>> v99 =
{
{1, 0, 0, 0, 0, 0, 0, 0, 0, },
{ 1, 1, 0, 0, 0, 0, 0, 0, 0, },
{ 5, 5, 2, 0, 0, 0, 0, 0, 0, },
{ 6, 5, 2, 2, 0, 0, 0, 0, 0, },
{ 6, 6, 4, 4, 3, 0, 0, 0, 0, },
{ 8, 7, 7, 4, 3, 3, 0, 0, 0, },
{ 8, 8, 7, 12, 12, 10, 10, 0, 0, },
{ 15, 14, 14, 13, 12, 11, 10, 9, 0, },
{ 15, 15, 14, 13, 13, 11, 11, 9, 9, },
};
vector<vector<int>> v62 =
{ { 1, 1},{ 1, 2},{ 2, 2},{ 3, 3},{ 3, 4},{ 4, 4}
};
vector<vector<int>> v92 =
{ { 1, 1},{ 1, 2},{ 2, 2},{ 3, 3},{ 3, 4},{ 4, 4},{ 5, 5},{ 5, 6},{ 6, 6}
};
vector<vector<int>> v22 =
{ { 1, 0},{ 1, 1}
};
vector<vector<int>> v23 =
{ { 1, 2, 2},{ 1, 1, 2}
};#define GETNUM(x,y) if(r==x && c==y)return v##x##y
vector<vector<int>> getNum(int r, int c)
{GETNUM(6, 6);GETNUM(9, 9);GETNUM(6, 2);GETNUM(9, 2);GETNUM(2, 2);GETNUM(2, 3);return vector<vector<int>>();
}bool getNum(int n, vector<vector<int>>&v)
{if (n < 2 || n>30)return false;if (n % 3 == 1)return false;if (n == 3 || n == 5)return false;if (n == 2)v = v22;else if (n == 6)v = v66;else if (n == 9)v = v99;else {int d = n % 3 ? 2 : n % 6 + 6;getNum(n - d, v);for (auto& vi : v)for (int j = 0; j < d; j++)vi.push_back(0);vector<vector<int>>vd;vd.resize(d);int k = calNum(n - d);if (n % 3 == 0) {for (int i = 0; i < (n - d) / 2; i++) {vector<vector<int>> vtmp = getNum(d, 2);addn(vtmp, k);k += d * 2 / 3;vd = join2(vd, vtmp);}}else {for (int i = 0; i < (n - d) / 3; i++) {vector<vector<int>> vtmp = getNum(d, 3);addn(vtmp, k);k += 2;vd = join2(vd, vtmp);}}vector<vector<int>> vtmp = getNum(d, d);addn(vtmp, k);vd = join2(vd, vtmp);v = join(v, vd);}
}#define CIN(x) while (!(cin >> x)) { \cin.clear();      \cin.ignore();     \}int main()
{int n;CIN(n);vector<vector<int>> v;getNum(n,v);int num = calNum(n);vector<vector<pair<int,int>>> ans;ans.resize(num + 1);for (int i = 0; i < v.size(); i++) {for (int j = 0; j < v.size(); j++)cout << setw(2) << v[i][j] << " ";cout << endl;}return 0;
}

运行示例:

puzzle(0413)PuzzleStoneBlocks、平铺楼梯区域相关推荐

  1. 陶哲轩等人用编程方法,推翻了60年几何难题「周期性平铺猜想」

    编辑 | 机器之心 点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心[全栈算法]技术交流群 数学家们曾预测,如果对形状如何平铺空间施加足 ...

  2. Duilib技巧:背景图片平铺

    贴图的描述 方式有两种     // 1.aaa.jpg     // 2.file='aaa.jpg' res='' restype='0' dest='0,0,0,0' source='0,0,0 ...

  3. 网页背景平铺_在大约十秒钟内为网页创建无缝平铺背景

    网页背景平铺 Creating a background image for your webpage (or desktop background) isn't challenging at all ...

  4. Java 在PPT中添加文本水印的简易方法(单一/平铺水印)

    [前言] 在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即在幻灯片中心位置水印以单个文本字样显示,但通过一定方法也可以添加多行(平铺)文本水印效果,即在幻灯片中 ...

  5. Android中实现平铺图片

    转载请标明出处:一片枫叶的专栏 最近开发App,美工设计了一个有锯齿边沿效果的背景图,只给了我一个锯齿,然后需要平铺展示锯齿效果: android中实现平铺图片有两种方式: (1)在drawable中 ...

  6. android平铺动画,Android实现平铺图片效果

    最近开发App,美工设计了一个有锯齿边沿效果的背景图,只给了我一个锯齿,然后需要平铺展示锯齿效果: android中实现平铺图片有两种方式: (1)在drawable中的drawable文件中定义平铺 ...

  7. html去图片平铺效果,css如何把图片平铺?

    css如何把图片平铺?下面本篇文章给大家介绍一下使用css设置背景图片平铺方式.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. background-repeat属性用于定义背景图像 ...

  8. ArchLinux开发环境第2辑——高效平铺式桌面i3个性化配置与美化

    "未来将属于两种人:思想的人和劳动的人.实际上,这两种人是一种人,因为思想也是劳动." --维克多·雨果 贴上效果图: ^ konsole ^ VS Code - OSS i3是一 ...

  9. AutoCAD 使用平铺视口

    使用平铺视口 AutoCAD 通常使用充满整个图形区域的单个视口来开始一个新图形.可以拆分模型标签的图形区域以同时显示多个视口.例如,如果同时显示整个视图和详细资料视图,则可以在整个图形上查看细节更改 ...

最新文章

  1. 【C/C++】链表的理解与使用
  2. 【直播资料下载】Python第五讲——关于爬虫如何做js逆向的思路
  3. linux apache 文件服务器,Linux下搭建Apache服务器全过程详解
  4. 模板—扩展GCD*2
  5. 深度学习100例 -卷积神经网络(ResNet-50)鸟类识别 | 第8天
  6. python画哪吒_用Python爬取暑期档大火的《哪吒》,20W+评论数据,我们分析一波...
  7. Centos6.5安装Kibana
  8. SpringMVC实现文件的上传与下载
  9. ModelSim入门及Testbench编写——合理利用仿真才是王道
  10. 计算机机房电力切换演练方案,机房停电应急演练实施具体技术方案.doc
  11. python 私有属性_Python3伪私有属性
  12. 【Win 10 应用开发】分析 URI 中的查询字符串
  13. c语言边界条件的设置,求解能不能用c或c++语言实现下面的约束条件
  14. Tomcat根目录下work文件夹的作用
  15. 2018年度最佳网页设计与开发教程
  16. 计算机网络实习个人总结,(实习报告)计算机网络实训个人小结
  17. Solaris 设备状态检查常用命令
  18. audio_policy_configuration.xml文件解析
  19. 在Linux下使用程序实现ls -l 的功能
  20. 【后端学习】后端技术要点总结【一】

热门文章

  1. 实训笔记202105110124郭静
  2. Python 三角形第三边
  3. php ng 性能,PHP NG (PHP 5.7) 性能比PHP5.6 提升近1倍
  4. 《Introduction to 3D Game Programming with Directx 11》随书代码在 Win10 和 Visual Studio 2017上的修改
  5. 周期性时间序列的预测
  6. 《毕业季,让我们共勉!》
  7. 【Purple Fringe】什么是紫边?蓝B+红R=紫
  8. 淘客技术篇-店铺满减券转链
  9. WebRTC之DTLS技术解析
  10. PNG文件解读(2):PNG格式文件结构与数据结构解读—解码PNG数据