题目: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;}
}
}
}

哈哈哈哈哈

最新文章

  1. web新内容
  2. 启动mysql错误ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
  3. 深入理解Binder(一),从AIDL谈起
  4. MAX函数和GROUP BY 语句一起使用的一个误区
  5. win7常用键
  6. Xcode7新特性
  7. General Structure of Quartz.NET and How To Implement It
  8. 【一天一道LeetCode】#13. Roman to Integer
  9. jvm学习一:类加载过程详解
  10. Unity UGUI Layout自动排版组件用法介绍
  11. java操作elasticsearch实现组合桶聚合
  12. Nginx 学习笔记(八)http和https跨域问题解决
  13. npm 设置和取消代理配置
  14. MGR架构~MGR+proxysql(1)
  15. Luogu P2426 【删数】
  16. Maven 常见错误
  17. codevs 2010 求后序遍历
  18. 一套准确率高且效率高的分词、词性标注工具-thulac
  19. lua源代码学习(一)lua的c api外围实现
  20. UEdit百度富文本编辑器

热门文章

  1. 玩转oracle学习第六天
  2. php给图片加入文字水印
  3. Javascript防冒泡事件与Event对象
  4. DB-MySQL:MySQL 运算符
  5. 3.多线程传参,以及tuple数组
  6. xBIM 高级01 IFC多模型合并
  7. Kali linux 2016.2(Rolling)的利用MSF攻击windows小案例(exploits + payloads + taegets)(博主推荐)
  8. POJ 2386 Lake Counting【BFS】
  9. CDR X6低价还能持续多久?官方回应18年元旦过后要涨价
  10. NOIp2018模拟赛三十六