转载标记处:http://blog.csdn.net/kalilili/article/details/43560257

思路:每次涂色以后必有一个格子的颜色是最终的颜色,否则这次涂色根本没意义,所以我们把每次涂色后哪些格子成为最终颜色的所有可能都入队,入队的元素是一个struct包含步数和最终颜色已确定的木块集合,这个集合必须用整数表示,所以用到状态压缩,因为最多只有16个格子,所以用16位的二进制来表示,1,表示此格子已是最终颜色,0,表示仍待涂色。

这道题目确实很难想,我最开始想的是用字符串哈希把每次涂的情况存下来,结果挂了。。。其实这样的做法并不能保证就一定是最少的步骤,因为涂的情况不同,但最终都能够到达最终的状态。。所以并不见得就一定是最优的。。

这题至少让我知道了如何找位压缩后的子集。。。详见代码

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;struct node
{int step,cur;
};
int len;
bool flag[1<<16]; //  记录哪些格子已是最终颜色
char str[20];int bfs()
{memset(flag,0,sizeof(flag));queue<node> que;node start={0,0};que.push(start);flag[0]=true;while(!que.empty()){node now=que.front();que.pop();if(now.cur==(1<<2*len)-1) return now.step; //颜色已涂满所有格子node next;next.step=now.step + 1;for(int i = 0;i < 2*len; i++){  //遍历这个图,找个起点开始涂色int tmp=0;if((1<<i) & now.cur) continue; //这个点已是最终颜色,continuefor(int j = i;j < (i/len+1)*len; j++){  //单行向右扩展,上界的确定是技巧if((1<<j)&now.cur) break;       //已扩展到最终颜色,不能把它覆盖,扩展结束if(str[j]==str[i]) tmp|=(1<<j); //如果拓展的位置需涂的颜色和起点颜色一样,那么就涂}for(int j = i-1;j >= (i/len)*len; j--){ //单行向左扩展,下界的确定是技巧if((1<<j) & now.cur) break;   //已扩展到最终颜色,不能把它覆盖,扩展结束if(str[j] == str[i]) tmp|=(1<<j);//如果拓展的位置需涂的颜色和起点颜色一样,那么就涂}for(int j = tmp; j > 0; j = tmp & (j-1)){ //把本次单行扩展的所有格子最终哪些格子成为最终颜色的所有可能入队,所有//可能也就是子集的所有可能,这种遍历集合子集的方式属于位压缩的知识if(!flag[j|now.cur]){  //这种情况已经产生过就不需入队了flag[j|now.cur]=1;next.cur=(j|now.cur); que.push(next);}}if(i >= len) continue;  //双行扩展,只要对某一行的点遍历作为起点即可if((1<<(i+len)) & now.cur) continue; //易错,这个起点的另一行对应的起点如果已是最终颜色,continuetmp=0; for(int j = i;j < len; j++){  //和单行拓展类似if((1<<j) & now.cur)break;if((1<<(j+len)) & now.cur)break;if(str[j] == str[i]) tmp|=(1<<j);if(str[j+len] == str[i]) tmp|=(1<<(j+len));}for(int j = i-1; j >= 0; j--){if((1<<j) & now.cur) break;if((1<<(j+len)) & now.cur) break;if(str[j] == str[i]) tmp|=(1<<j);if(str[j+len] == str[i]) tmp|=(1<<(j+len));}for(int j = tmp; j > 0; j = tmp & (j-1)){ //和单行拓展子集入队类似if(!flag[j|now.cur]){flag[j|now.cur]=1;next.cur=(j|now.cur);que.push(next);}}}}
}
int main()
{int t,cas = 1;scanf("%d",&t);while(t--){scanf("%d",&len);scanf("%s%s",str,str+len);printf("Case #%d: %d\n",cas++,bfs());}return 0;
}

hdu 4012(bfs+位压缩)相关推荐

  1. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  2. BFS+状态压缩 hdu-1885-Key Task

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1885 题目意思: 给一个矩阵,给一个起点多个终点,有些点有墙不能通过,有些点的位置有门,需要拿到相应 ...

  3. BFS + 状态压缩总结

    BFS + 状态压缩使用条件 求最短路径时,一般来说会优先考虑使用BFS算法.BFS算法在广度优先搜索的过程中会有一个类似vis的数组去重,避免重复访问 但是在一些情况下,题目需要求最短路径的同时,有 ...

  4. csu 1536 Bit String Reordering(模拟 bfs+状态压缩)

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1536 题意: 输入n个只为 0或1 的数 形成一个排列 再输入m个数 每个数代表 目标排列 (样例 ...

  5. 22位压缩版UUID

    package com.lym.order.util;import javax.xml.crypto.Data; import java.util.Base64; import java.util.D ...

  6. 高精度4位压缩法原理与实现

    我们都知道 int类型占32bit 可表示范围: [-2147483648,2147483647] long long类型 64bit可表示范围:[-9223372036854775808,92233 ...

  7. nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

    题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可 ...

  8. hdu 1429 胜利大逃亡(续) bfs+状态压缩

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  9. hdu 1044 BFS(压缩图)+DFS

    题意:              给你起点,终点,图上有墙有路还有宝物,问你在规定时间内能否能到终点,如果能问最多能捡到多少宝物. 思路:           看完这个题目果断 BFS+三维的mark ...

最新文章

  1. 抢领英饭碗?Facebook测试简历功能
  2. 支付业务流程--h5、APP
  3. springboot设置欢迎页
  4. 广外计算机考研专业课,【广外考研论坛】 21广外各专业考研问题全解答!纯干货!...
  5. HTML 部分常用属性、组成属性|...超链接、路径、锚点、列表、滚动、URL编码、表格、表单、GET和POST
  6. 【洛谷P1966】火柴排队
  7. java sbyte_Java Byte parseByte()方法
  8. [IE编程] 打开/关闭IE8的光标浏览模式(Caret Browsing)
  9. 大数据可视化平台有什么优势
  10. 梁肇新《编程高手箴言》书评
  11. 免费PR模板 20个Premiere简单标题文字动画PR模板
  12. Composer 的常用命令
  13. c语言实训报告心得100字,c语言实训报告心得.doc
  14. JavaScript开发——文件夹的上传和下载
  15. 下载图片 getInputStream、available()问题
  16. C++引用计数原理和实现
  17. mac node如何升级版本
  18. 肿瘤免疫新抗原鉴定(一)OptiType安装与运行
  19. phpstorm快速编辑模板技巧
  20. Geography V.S. Geometry

热门文章

  1. 独家 | 神策 2019 数据驱动大会现场「视频+PPT」合集
  2. 极简数据分析实操指南(上)
  3. 喜茶获美团点评旗下基金4亿元投资!它离行业独角兽还差多远?
  4. JavaScript实现冒泡排序 可视化
  5. 浅谈APP流式分页服务端设计(转)
  6. Java 7之基础 - 强引用、弱引用、软引用、虚引用
  7. freebsd 运维人员
  8. SQL2005 属性 IsLocked 不可用于 登录[sa]
  9. 网管员心声:Windows服务有“备”无患
  10. How to write journal papers?