《挑战程序设计竞赛》P196 铺砖问题
题意:给定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 铺砖问题的更多相关文章
- Aizu 2249Road Construction 单源最短路变形《挑战程序设计竞赛》模板题
King Mercer is the king of ACM kingdom. There are one capital and some cities in his kingdom. Amazin ...
- 《挑战程序设计竞赛》2.3 动态规划-优化递推 POJ1742 3046 3181
POJ1742 http://poj.org/problem?id=1742 题意 有n种面额的硬币,面额个数分别为Ai.Ci,求最多能搭配出几种不超过m的金额? 思路 据说这是传说中的男人8题呢,对 ...
- 挑战程序设计竞赛》P345 观看计划
<挑战程序设计竞赛>P345 观看计划 题意:一周一共有M个单位的时间.一共有N部动画在每周si时 ...
- POJ 2386 Lake Counting 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=2386 <挑战程序设计竞赛>习题 题目描述Description Due to recent rains, water has ...
- poj 3253 Fence Repair 贪心 最小堆 题解《挑战程序设计竞赛》
地址 http://poj.org/problem?id=3253 题解 本题是<挑战程序设计>一书的例题 根据树中描述 所有切割的代价 可以形成一颗二叉树 而最后的代价总和是与子节点和深 ...
- 《挑战程序设计竞赛》 4.1.1 矩阵 P286
想写几篇挑战的感悟,也有助于自己理解这本书.但这上面大多贴的是书上的代码,主要是为了用的时候后直接复制就好了,这样就很方便了,就相当于黑盒模板了. 1.线性方程组 /** \brief 高斯消元法 * ...
- poj1182食物链_并查集_挑战程序设计竞赛例题
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 65534 Accepted: 19321 Description ...
- 迷宫问题_BFS_挑战程序设计竞赛p34
给定一个N*M的迷宫,求从起点到终点的最小步数. N,M<100: 输入: 10 10#S######.#......#..#.#.##.##.#.#........##.##.####.... ...
- 【网络流#9】POJ 2135 Farm Tour 最小费用流 - 《挑战程序设计竞赛》例题
[题意]给出一张无向图,从1开始到n,求两条没有公共边的最短路,使得路程总和最小 每条边的权值设为费用,最大流量设为1,然后就是从源点到汇点流量为2的最小费用流. 因为是规定了流量,新建一个源点和一个 ...
随机推荐
- c++中的结构化语句 判断语句if 分支语句switch 循环语句 while 和 do while 循环语句for的使用
作业1: 使用if语句,根据1~7的数字,输出今天是星期几?的程序. 方法一,直接使用单独的if语句 #include <iostream> using namespace std; in ...
- 单例Singleton
先提供一个完整版: // .h文件 @interface SingleTon : NSObject /** 获取单例对象 */ + (instancetype)sharedInstance; + (i ...
- PAT 乙级 1003
题目 题目地址:PAT 乙级 1003 题解 规律观察题,本题的关键在于把题读懂,同时还有几个比较容易疏忽的地方需要注意:总之这道题要考虑的东西更多,细节上也要特别注意: 规律:“如果 aPbTc 是 ...
- 大蟒蛇肚子的"风暴"
遇到了数据库连接数不足的问题,一般情况下会预留一些会话增加的情况,但在一些特殊情况下如连接风暴(logon storm), 如果在监听中没有做rate限流,对数据库来说巨大的冲击可能会导致数据库Han ...
- zabbix 密码忘记了如何恢复
1.进入数据库 2.使用zabbix的数据库 use zabbix: 3.查看表信息 show tables; 4.搜索users表 select * from users; 5.修改userid为1 ...
- php中关于empty()函数是否为真的判断
<?php// $a = 0; ==> 符合empty,empty($a)为true// $a = '0'; ==> 符合empty,empty($a)为true// $a = ...
- A1012 The Best Rank (25)(25 分)
A1012 The Best Rank (25)(25 分) To evaluate the performance of our first year CS majored students, we ...
- 算法训练 Eurodiffusion
Eurodiffusion /***********并未完全AC***********/ #include<iostream> #include<algorithm> #inc ...
- HDU_6194 后缀数组+RMQ
好绝望的..想了五个多小时,最后还是没A...赛后看了下后缀数组瞬间就有了思路...不过因为太菜,想了将近两个小时才吧这个题干掉. 首先,应当认为,后缀数组的定义是,某字符串S的所有后缀按照字典序有小 ...
- Android Kotlin适用小函数
都是一些Android适用的Kotlin小函数. 1.点击空白隐藏键盘 //点击空白隐藏键盘 override fun onTouchEvent(event: MotionEvent): Boolea ...