POJ 4007 Flood-it!
题目:http://poj.org/problem?id=4007
思路:
(lyd学长的思路)
IDA*算法,首先迭代加深限制搜索深度。
可以发现如果当前矩阵中除了左上角的连通块之外,共有M种颜色,那么还需要的步数不小于M。如果当前搜索深度+估价函数的值>深度限制,可以剪枝。
如果改变颜色后,左上角格子所在的联通块大小没有改变,可以剪枝,避免来回往复地搜索。
每次寻找左上角的格子所在的连通块耗费的时间常数巨大,可以在这里寻求突破。我们引入一个N*N的v数组。左上角的格子所在的连通块里的格子标记为1。左上角连通块周围一圈格子标记为2,其它格子标记为0。如果某次选择了颜色c,我们只需要找出标记为2并且颜色为c的格子,向四周扩展,并相应地修改v标记,就可以不断扩大标记为1的区域,最终如果所有格子标记都是1,就找到了答案。
//By SiriusRen
#include <cstdio>
#include <cstring>
using namespace std;
#define ff for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)
int n,a[10][10],vis[10][10],xx[]={1,-1,0,0},yy[]={0,0,1,-1},T;
bool check(int x,int y){return x>=1&&y>=1&&x<=n&&y<=n;}
void dye(int x,int y,int color){
vis[x][y]=1;
for(int i=0;i<=3;i++){
int dx=x+xx[i],dy=y+yy[i];
if(vis[dx][dy]==1||!check(dx,dy))continue;
if(a[dx][dy]==color)dye(dx,dy,color);
else vis[dx][dy]=2;
}
}
int h(){
int cnt=0,col[6];
memset(col,0,sizeof(col));
ff if(vis[i][j]!=1&&!col[a[i][j]])
cnt++,col[a[i][j]]=1;
return cnt;
}
bool count(int color){
bool flag=0;
ff if(a[i][j]==color&&vis[i][j]==2)
flag=1,dye(i,j,color);
return flag;
}
bool A_star(int deep){
if(deep==T)return !h();
if(deep+h()>T)return 0;
for(int ii=0;ii<=5;ii++){
int temp[9][9];
ff temp[i][j]=vis[i][j];
if(!count(ii))continue;
if(A_star(deep+1))return 1;
ff vis[i][j]=temp[i][j];
}
return 0;
}
int main(){
while(~scanf("%d",&n)&&n){
memset(vis,0,sizeof(vis));
ff scanf("%d",&a[i][j]);
dye(1,1,a[1][1]);
for(T=h();;T++){
if(A_star(0)){printf("%d\n",T);break;}
}
}
}
哈哈哈哈哈
POJ 4007 Flood-it!的更多相关文章
- 【POJ 4007】 Flood-it!
[题目链接] http://poj.org/problem?id=4007 [算法] IDA* [代码] #include <algorithm> #include <bitset& ...
- [NOIP 2014复习]第二章:搜索
一.深度优先搜索(DFS) 1.Wikioi 1066引水入城 题目描写叙述 Description 在一个遥远的国度,一側是风景秀美的湖泊,还有一側则是漫无边际的沙漠.该国的行政 区划十分特殊,刚好 ...
- 【POJ】4007.Flood-it!
原题戳这里 题解 搜索是个好东西,不是人人都会搜 迭代加深,然后用一个函数估值,值是除了和左上连通的部分还有几个颜色不同的块,如果走的步数加上估值大于当前枚举的深度就跳出 代码 #include &l ...
- SYN Flood测试
由于工作需要对公司进行SYN Flood测试,在网上查了些资料,Youtube上找到最多的方法就是hping3工具来实现, 该工具已经预装在Kali下,具体操作用一条命令即可实现. hping3 -S ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- POJ 2965. The Pilots Brothers' refrigerator 枚举or爆搜or分治
The Pilots Brothers' refrigerator Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22286 ...
- POJ 1753. Flip Game 枚举or爆搜+位压缩,或者高斯消元法
Flip Game Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37427 Accepted: 16288 Descr ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
随机推荐
- 实战:percona-xtrabackup 2.1.9 for mysql 5.6.19
----1.编译安装percona-xtrabackup yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr ...
- sizeof()函数的使用——————【Badboy】
1.sizeof的使用:sizeof操作符以字节形式给出了其操作数的存储大小. sizeof操作符不能用于函数类型,不全然类型或位字段.不全然类型指具有未知存储大小的数据类型,如未知存储大小的数组类型 ...
- ZOJ 1696 Viva Confetti 计算几何
计算几何:按顺序给n个圆覆盖.问最后能够有几个圆被看见.. . 对每一个圆求和其它圆的交点,每两个交点之间就是可能被看到的圆弧,取圆弧的中点,往外扩展一点或者往里缩一点,从上往下推断有没有圆能够盖住这 ...
- 2015多校联合训练赛hdu 5301 Buildings 2015 Multi-University Training Contest 2 简单题
Buildings Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Tota ...
- C#各个版本中的新增特性详解【转】
序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...
- 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ...
- sqlserver 恢复模式及避免日志爆满的方法
recovery simple 循环日志,空间自动回收,不可备份日志,恢复时仅能恢复到数据库备份时间点: 用于落地数据或测试环境或OLAP,不推荐用于生产OLTP 有时候distribution过大也 ...
- javascript工具--控制台详解
一.显示信息的命令 console.log(); //控制台输入 网页中不会输出 console.info(); //一般信息 console.debug(); //除错信息 console.w ...
- java爬虫的selenium基础使用
实用博客 selenium java教程 具体项目运用 项目背景:从西安市人民政府网站上获取到县区新闻,从下图可以看出“区县热点”是需要在页面中进行点击的,这里页面使用的是javascript的函数 ...
- sass的用法小结(三)
5. 混合器; 如果你的整个网站中有几处小小的样式类似(例如一致的颜色和字体),那么使用变量来统一处理这种情况是非常不错的选择.但是当你的样式变得越来越复杂,你需要大段大段的重用样式的代码,独立的变量 ...