题意:给定n*m格子,每个格子被染成了黑色或者白色,现在要用1*2的砖块覆盖这些格子,块与块不得重叠,且覆盖所有的白色格子,但不覆盖任意一个黑色格子,求一共有多少种覆盖方法。

思路:书上给的思路太巧妙以至于一时无法参透,于是找了一些相关的铺砖问题的解法,在此思路上改进了一下。具体思路可以参考https://blog.csdn.net/Lu597203933/article/details/44137277

这个问题在此基础上多了一个条件,即黑色格子无法被覆盖,略作改进即可。

实现代码:

#define _CRT_SECURE_NO_DEPRECATE
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define N_MAX 16
#define MOD 10000000
#define INF 0x3f3f3f3f
int n, m;
char color[N_MAX][N_MAX];
int dp[N_MAX][ << N_MAX]; bool TestFirstLine(int k) {//测试状态k是否可以作为第一列
int i = ;
while (i<m) {
if (color[][i] == 'x') {
if ((k >> i) & )i++;
else return false;
}
else {
if (!(k >> i & ))i++;
else if (i == m - || !(k >> (i + ) & ))return false;
else i += ;
}
}
return true;
}
bool judge(int k, int j) {//第j行状态k是否合法,即状态k在规定黑色的格子处必须是1,否则不合法
int i = ;
while (i<m) {
if (!(k >> i & ) && color[j][i] == 'x')return false;
i++;
}
return true;
} bool Testcompatible(int cur, int prev, int k) {//cur是当前状态,prev是上一次的状态
if (!judge(prev, k - ))return false;
int i = ;
while (i<m) {
if (!(cur >> i & )) {
if ((prev >> i & )) i++;
else return false;
}
else if (color[k][i] == 'x') {
if (prev >> i & )i++;
else return false;
}
else {
if (!(prev >> i & ))i++;
else {
if (i == m - ||!((cur>>(i+)&)&&(prev >> (i + ))&))return false;//!!!!!
else i += ;
} }
}
return true;
} int main() {
while (cin >> n >> m) {
for (int i = ; i < n; i++)
for (int j = ; j < m; j++)
scanf(" %c", &color[i][j]);
if (m > n)swap(m, n);
memset(dp, , sizeof(dp));
int allstates = << m;
for (int j = ; j < allstates; j++) {
if (TestFirstLine(j))dp[][j] = ;
}
for (int i = ; i < n; i++) {
for (int j = ; j < allstates; j++) {
for (int k = ; k < allstates; k++) {
if (!judge(j, i))continue;
if (Testcompatible(j, k, i)) {
dp[i][j] += dp[i - ][k];
dp[i][j] %= MOD; }
}
}
}
cout << dp[n - ][allstates - ] << endl;
}
return ;
}
/*(.是白色,*是黑色)
3
3
. . .
. x .
. . . output:2
*/

《挑战程序设计竞赛》P196 铺砖问题的更多相关文章

  1. Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题

    King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...

  2. 《挑战程序设计竞赛》2.3 动态规划-优化递推 POJ1742 3046 3181

    POJ1742 http://poj.org/problem?id=1742 题意 有n种面额的硬币,面额个数分别为Ai.Ci,求最多能搭配出几种不超过m的金额? 思路 据说这是传说中的男人8题呢,对 ...

  3. 挑战程序设计竞赛》P345 观看计划

                                                 <挑战程序设计竞赛>P345 观看计划 题意:一周一共有M个单位的时间.一共有N部动画在每周si时 ...

  4. POJ 2386 Lake Counting 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=2386 <挑战程序设计竞赛>习题 题目描述Description Due to recent rains, water has ...

  5. poj 3253 Fence Repair 贪心 最小堆 题解《挑战程序设计竞赛》

    地址 http://poj.org/problem?id=3253 题解 本题是<挑战程序设计>一书的例题 根据树中描述 所有切割的代价 可以形成一颗二叉树 而最后的代价总和是与子节点和深 ...

  6. 《挑战程序设计竞赛》 4.1.1 矩阵 P286

    想写几篇挑战的感悟,也有助于自己理解这本书.但这上面大多贴的是书上的代码,主要是为了用的时候后直接复制就好了,这样就很方便了,就相当于黑盒模板了. 1.线性方程组 /** \brief 高斯消元法 * ...

  7. poj1182食物链_并查集_挑战程序设计竞赛例题

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 65534   Accepted: 19321 Description ...

  8. 迷宫问题_BFS_挑战程序设计竞赛p34

    给定一个N*M的迷宫,求从起点到终点的最小步数. N,M<100: 输入: 10 10#S######.#......#..#.#.##.##.#.#........##.##.####.... ...

  9. 【网络流#9】POJ 2135 Farm Tour 最小费用流 - 《挑战程序设计竞赛》例题

    [题意]给出一张无向图,从1开始到n,求两条没有公共边的最短路,使得路程总和最小 每条边的权值设为费用,最大流量设为1,然后就是从源点到汇点流量为2的最小费用流. 因为是规定了流量,新建一个源点和一个 ...

随机推荐

  1. 你所不知道的js的小知识点(1)

    1.js调试工具 debugger <div class="container"> <h3>debugger语句会产生一个断点,用于调试程序,并没有实际功能 ...

  2. 二十五、MySQL 索引

    MySQL 索引 MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索 ...

  3. A Bug's Life(削弱版食物链)

    Description Background  Professor Hopper is researching the sexual behavior of a rare species of bug ...

  4. 使用Xshell对虚拟机上的Ubuntu系统进行远程连接

    需要在Linux上安装openssh-server 1.在Ubuntu系统的终端下输入命令:sudo apt install openssh-server 2.在Xshell中输入指定连接的主机IP, ...

  5. Python知识点入门笔记——特色数据类型(字典)

    Python中字典是一些列键 (key) 值 (value) 对组成的,形式如下 {键1:值1,键2:值:2} 每个键值对用冒号隔开,每对之间用逗号隔开 键必须是唯一的,必须是不可变的,如字符串,数字 ...

  6. 跨域问题和django中实现跨域

    跨域问题 1.同源策略(浏览器的安全功能): 请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同 2.CORS跨域资源共享 实现CORS通信的关键是服务器,只要服务器实 ...

  7. V4L2学习(三)框架分析

    整个v4l2的框架分为三层: 在应用层,我们可以在 /dev 目录发现 video0 类似的设备节点,上层的摄像头程序打开设备节点进行数据捕获,显示视频画面.设备节点的名字很统一,video0 vid ...

  8. C语言用一维数组打印杨辉三角(原:无意中想到)

    本贴地址 ] = { }; a[] = , a[] = ; int i, j,m; ; i <= ; i++) //2-11 输出10行 { ; j > ; j--) //关键在这句,倒着 ...

  9. P3402 最长公共子序列(nlogn)

    P3402 最长公共子序列 题目背景 DJL为了避免成为一只咸鱼,来找Johann学习怎么求最长公共子序列. 题目描述 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子 ...

  10. 安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200)

    安装 Windows Server 2012 Active Directory 只读域控制器 (RODC)(级别 200) 适用对象:Windows Server 2012 本主题介绍如何创建分步的 ...