题目链接:
题目描述:用1*2 的矩形通过组合拼成大矩形,求拼成指定的大矩形有几种拼法。
首先 我们先求用1*2 的矩形拼成 n*m的矩形有多少种拼法
当n*m为奇数时,一定是不会拼出来的,因为想要拼出来就需要整数倍的小矩形数目。
分两个步骤:1) 先求出相邻两行的转化关系
2) 通过相邻两行的转化关系算出经过n次转化有几种方法能拼成n*m的矩阵
1) 状态标记 横放和竖放的下一个均为1,竖放的上一个和不放置为0 ,每行可以转化为1个2进制数。当这一行访问结束时,就会得到上一行状态,和该行状态,因为所有情况都是我们设置的,所以pre状态一定会转化为now状态
对于每一个位置,我们有三种放置方法:1. 竖直放置2. 水平放置3. 不放置
d为当前列号 ,初始化d, now, pre都为0。now为当前行,pre为当前行的上一行
1. d = d + 1, now << 1 | 1, pre << 1; // 竖直放置,当前行该列为1,上一行该列置为为0
2. d = d + 2, now << 2 | 3, pre<< 2 | 3; // 横放 都为11
3. d = d + 1, now << 1, pre<< 1 | 1; // 上一行该列置为1,不能竖放,不放置的状态
因为转移状态有很多种,所以用dfs去枚举各种可行的状态。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include