Paint on a Wall
Paint on a Wall
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4012
搜索+状态压缩
这题刚开始以为是dp(之前写过墙是一行的题,然而是在艾神讲完之后才调出来的= =),但是想不出来怎么搞,看到n<=8数据量这么小,应该搜索可以解,然后想都没想就上去写了IDA*,结果有段代码怎么都找不到bug,一直WA。
结束后,用bfs写了遍,每次转移数最多是(2n)^2,最差的情况是2n层,所以复杂度是(2n)^(4n),然而状态去重后,状态数最多为2^(2n)种,复杂度为[(2n)^2]*[2^(2n)],由于n很小,所以不会超时。然而如果用之前的IDA*,差不多会把深度小于deep的所有解空间遍历,一定会超时。
debug用了好几个小时,最后发现是
(lower&bit[other*n+i])>
写成了
(lower&bit[other*n+i])==
...不想说什么了...
代码如下:
#include<cstdio>
#include<cstring>
#include<queue>
#define met(a,b) memset(a,b,sizeof(a))
#define mkp(state,deep) make_pair(state,deep)
#define X first
#define Y second
#define N 8
using namespace std;
typedef pair<int,int> P;
int T,n,ans,before,after;
char mp[][N+];
bool state[<<];
int bit[];
void init(){
for(int i=;i<=;++i)
bit[i]=(<<i);
}
void bfs(){
int finish=(<<(*n))-;
met(state,);
queue<P>q;
q.push(mkp(,));
state[]=;
while(!q.empty()){
P s=q.front();q.pop();
if(s.X==finish){
ans=s.Y;
return;
}
for(int c=;c<n;++c)
for(int r=;r<;++r)
if((s.X&bit[r*n+c])==){
char color=mp[r][c];
int other=(int)(!r);
int upper=s.X;
int lower=s.X;
int deep=s.Y;
for(int i=c;i<n;++i){
if((upper&bit[r*n+i])>&&mp[r][i]!=color)
upper^=bit[r*n+i];
else if((upper&bit[r*n+i])==&&mp[r][i]==color)
upper|=bit[r*n+i];
if((lower&bit[other*n+i])>&&mp[other][i]!=color)
lower^=bit[other*n+i];
else if((lower&bit[other*n+i])==&&mp[other][i]==color)
lower|=bit[other*n+i];
if(!state[upper]){
state[upper]=;
q.push(mkp(upper,deep+));
}
int temp;
if(r==)temp=(before&upper)|(after&lower);
else if(r==)temp=(after&upper)|(before&lower);
if(!state[temp]){
state[temp]=;
q.push(mkp(temp,deep+));
}
}
}
}
}
int main(void){
init();
scanf("%d",&T);
for(int t=;t<=T;++t){
scanf("%d\n",&n);
before=after=;
for(int i=;i<*n;++i){
if(i<n)before|=(<<i);
else after|=(<<i);
}
for(int i=;i<;++i)
scanf("%s",mp[i]);
bfs();
printf("Case #%d: ",t);
printf("%d\n",ans);
}
}
Paint on a Wall的更多相关文章
- HDU 4012 Paint on a Wall(状压+bfs)
Paint on a Wall Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) ...
- LED Decorative Light Manufacturer - Led Wall Lamp Performance Characteristics
LED Decorative Light Manufacturer introduction: LED wall lamp is a light-emitting diode as a ligh ...
- Daily record-October
October 11. Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是美好的,也许是人 ...
- 2018 codejam kickstart H轮
被第一题傻逼题卡了很久……好的我也是个傻逼 倒在了最后一题 本来以为小数据过了就能过大数据 结果下载了大数据 发现怎么输出了好多个零 调代码过程中超时了 结束后重新提交了一下 果然是不通过的 A 题目 ...
- HDU 4391 Paint The Wall(分块+延迟标记)
Paint The Wall Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 线段树 扫描线 L - Atlantis HDU - 1542 M - City Horizon POJ - 3277 N - Paint the Wall HDU - 1543
学习博客推荐——线段树+扫描线(有关扫描线的理解) 我觉得要注意的几点 1 我的模板线段树的叶子节点存的都是 x[L]~x[L+1] 2 如果没有必要这个lazy 标志是可以不下传的 也就省了一个pu ...
- 【HDU4391】【块状链表】Paint The Wall
Problem Description As a amateur artist, Xenocide loves painting the wall. The wall can be considere ...
- hdu 1543 Paint the Wall
http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...
- Paint the Wall ZOJ - 2747
点数很多,坐标值很大,然后离散化一下用一个点表示一小块的面积对应的颜色,然后更新的时候一块一块更新,查询的时候一块一块查询 #include<map> #include<set> ...
随机推荐
- Java 并发 中断线程
Java 并发 中断线程 @author ixenos 对Runnable.run()方法的三种处置情况 1.在Runnable.run()方法的中间中断它 2.等待该方法到达对cancel标志的测试 ...
- html5的navigator调用手机震动
navigator.vibrate(s) 或 navigator.webkitVibrate(s),不过该属性只在安卓系统有效.
- 中兴电信光纤猫F450获取管理员密码方法
初衷:为了完成端口映射,一开始以为电信光猫不支持自定义路由,因为通过useradmin登录进去后没有找到对应的选项.一番了解之后,原来光猫有超级密码,电信装机时是不会告诉你的,电信客服一般也不会告诉你 ...
- C++ 部分知识点
1,return语句返回函数的返回值,就是函数的类型,函数只能有唯一的返回值: return可以停止函数,并将控制返回主调函数: 一个函数可以有许多return语句,执行到哪个return语句,哪个起 ...
- GNU/Linux下Freeplane的界面渲染问题
如下图所示,思维导图软件Freeplane在GNU/Linux下默认的界面渲染效果是很差的,即便将Preferences → Appearance → Antialias设置为Antialias al ...
- JavaScript简单的一些....
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- C#如何实现url短地址?C#短网址压缩算法与短网址原理入门
c# url短地址压缩算法与短网址原理的例子,详细介绍了短网址的映射算法,将长网址md5生成32位签名串,分为4段,每段8个字节,然后生成短网址,具体见文本实例. 短网址映射算法: 将长网址md5生成 ...
- Vim插件之Command-T使用问题
最近在使用vim插件CommandT时出现问题其实就是vim没有支持ruby,不过google之后找到了解决方法,老外的态度还是很让人敬佩的,度娘搜索的结果太让人呕心了.. 贴下,以后再次遇到解决. ...
- IQueryable 和 IEnumerable
IQueryable 和 IEnumerable 其实,对于上面的即有过虑又有排序的条件查询Linq语句,EF是读取数据库中整个Books表中的数据到内存,还是根据Linq查询语句智能的生成SQL再执 ...
- Junit4单元测试之高级用法
Junit单元测试框架是Java程序开发必备的测试利器,现在最常用的就是Junit4了,在Junit4中所有的测试用例都使用了注解的形式,这比Junit3更加灵活与方便.之前在公司的关于单元测试的培训 ...