《挑战程序设计竞赛》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的最小费用流. 因为是规定了流量,新建一个源点和一个 ...
随机推荐
- java算法面试题:从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 ;读取docx 读取doc 使用poi 相关jar包提集提供下载
从类似如下的文本文件中读取出所有的姓名,并打印出重复的姓名和重复的次数,并按重复次数排序 1,张三,28 2,李四,35 3,张三,28 4,王五,35 5,张三,28 6,李四,35 7,赵六,28 ...
- 已解决: mybatis报错 org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'xxx' in 'class java.lang.String'
最近在练习MyBatis时 进行姓名的模糊查询时候出现 org.apache.ibatis.exceptions.PersistenceException: ### Error querying da ...
- C++ 限定名称查找
限定名称查找规则实际归纳下来很简单,先对::左边的名称进行查找(遵循,限定,无限定),然后在左边查找到的(此时只查找类型名称)名字的作用域内(含内联名称空间件)查找右边出现的名字,查找到即存在(故可以 ...
- php 递归
function digui($data,$j=0,$lev=0){ $subs=array();//存放子孙数组 foreach ($data as $v){ if ($v['parent_id'] ...
- 【前端_js】前端跨网络异步获取资源——fetch()
Fetch API 提供了一个 JavaScript接口,用于访问和操纵HTTP管道的部分,例如请求和响应.它还提供了一个全局 fetch()方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源 ...
- 项目实战8.1—tomcat企业级Web应用服务器配置与会话保持
分类: Linux架构篇 tomcat企业级Web应用服务器配置与实战 环境背景:公司业务经过长期发展,有了很大突破,已经实现盈利,现公司要求加强技术架构应用功能和安全性以及开始向企业应用.移动A ...
- 在kali上安装谷歌浏览器
在kali上安装谷歌浏览器的时候,遇到了很多问题,经过不懈努力,终于解决,现在把方法总结一下,希望对遇到同样问题的人能有一定帮助.这是给最白的小白参考的,大牛勿喷哈. 首先去这个网站www.googl ...
- 第八篇:ORM框架SQLAlchemy 了解知识
一 介绍 SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取 ...
- JVM 内存分配和回收策略
对象的内存分配,主要是在java堆上分配(有可能经过JIT编译后被拆为标量类型并间接地在栈上分配),如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配.少数情况下也是直接分配到老年代,分配规则不 ...
- CRM第一篇:权限组件之权限控制
一.权限组件(1):一级菜单 二.权限组件(2):二级菜单 三.权限组件(3):默认选中非菜单(二级菜单) 四.权限组件(4):给动态菜单增加面包屑导航 五.权限组件(5):权限粒度控制到按钮 六.权 ...