2495 水叮当的舞步

  

题目描述 Description

  水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
  为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~

  地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
  水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
  由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。

输入描述 Input Description

  每个测试点包含多组数据。
  每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
  接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
  N=0代表输入的结束。

输出描述 Output Description

  对于每组数据,输出一个整数,表示最少步数。

样例输入 Sample Input

  2
  0 0 
  0 0
  3 
  0 1 2 
  1 1 2
  2 2 1
  0

样例输出 Sample Output

  0
  3

数据范围及提示 Data Size & Hint

  对于30%的数据,N<=5
  对于50%的数据,N<=6
  对于70%的数据,N<=7
  对于100%的数据,N<=8,每个测试点不多于20组数据。

第二组样例解释:
  0 1 2       1 1 2       2 2 2      1 1 1
  1 1 2 --> 1 1 2 --> 2 2 2 --> 1 1 1
  2 2 1       2 2 1       2 2 1      1 1 1


   一开始打了一个四不像的搜索。。只有30..

  后来瞄了一眼题解。。

  发现解题思路还是很神的

  估价函数比较裸:当前剩余颜色数目

  剩下就是怎么搜索了

  把图分为3种颜色

  与(1,1)在一个同色联通块里为1

  在联通块边界但是不与联通块同色为2

  剩下为0

  每次变颜色搜遍整个图然后把与要变颜色相同的且颜色为2的格子拓展一下

  最后都是1的时候退出

  IDA*

  

 #include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm> using namespace std; int n=,map[][],X[]={,,,-},Y[]={,-,,},MAP[][]; bool g[][]; void pre(int x,int y,int col)
{
MAP[x][y]=;
if(x==&&y==)col=map[][];
for(int i=;i<;i++)
{
int xx=x+X[i],yy=y+Y[i];
if(xx<=n&&yy<=n&&xx>=&&yy>=&&MAP[xx][yy]!=)
{
if(map[xx][yy]==col)pre(xx,yy,col);
else MAP[xx][yy]=;
}
}
} /*void ran(int x,int y,int col)
{
for(int i=0;i<4;i++)
{
int xx=x+X[i],yy=y+Y[i];
if(xx<=n&&yy<=n&&xx>=1&&yy>=1&&map[xx][yy]==map[1][1]&&(!(xx+yy==2&&xx==1)))
map[xx][yy]=col,ran(xx,yy,col);
}
}*/ int get()
{
int res[]={},nu=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(!res[map[i][j]] && MAP[i][j]!=)
{
res[map[i][j]]=;
nu++;
}
return nu;
} void dfs(int x,int y,int col)
{
MAP[x][y]=;
for(int i=;i<;i++)
{
int xx=X[i]+x,yy=y+Y[i];
if(xx<=n&&yy<=n&&xx>=&&yy>=&&MAP[xx][yy]!=)
{
if(map[xx][yy]==col)dfs(xx,yy,col);
else MAP[xx][yy]=;
}
}
} bool fill(int col)
{
int ret=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(MAP[i][j]==&&map[i][j]==col)
{
ret++;
dfs(i,j,col);
}
return ret;
} bool IDA(int k)
{
/*memset(g,0,sizeof(g));
int stop=find(1,1,0),ctrl=0,temp[11][11];
if(!stop)return 1;
else if(!k)return 0;
for(int i=0;i<=5;i++)
if(i!=map[1][1]&&(stop&(1<<i))!=0)
{
memcpy(temp,map,sizeof(map));
ran(1,1,i);
map[1][1]=i;
ctrl=IDA(k-1);
if(!ctrl)memcpy(map,temp,sizeof(temp));
else return 1;
}
return 0;*/
int nu=get();
if(nu==)return ;
else if(k+<nu)return ;
int temp[][]={};
for(int i=;i<=;i++)
{
memcpy(temp,MAP,sizeof(MAP));
if(fill(i) && IDA(k-))return ;
memcpy(MAP,temp,sizeof(temp));
}
return ;
} int main()
{
while()
{
scanf("%d",&n);
if(!n)break;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&map[i][j]);
memset(MAP,,sizeof(MAP));
pre(,,map[][]);
for(int i=;i<=n*n;i++)
if(IDA(i)){printf("%d\n",i);break;}
}
return ;
}

  

 

【IDA*】codevs 2495:水叮当的舞步的更多相关文章

  1. codevs 2495 水叮当的舞步

    题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...

  2. codevs 2495 水叮当的舞步IDA*

    /* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...

  3. 【wikioi】2495 水叮当的舞步(IDA*)

    http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...

  4. bzoj3041 水叮当的舞步 IDA*

    水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 230  Solved: 107[Submit][Status][Discuss] Des ...

  5. 【BZOJ3041】水叮当的舞步 迭代深搜IDA*

    [BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...

  6. BZOJ 3041 水叮当的舞步

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 67[Submit][Status][Discuss ...

  7. bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 44[Submit][Status] Descript ...

  8. [codevs2495]水叮当的舞步

    [codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...

  9. Bzoj3041 水叮当的舞步

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 132  Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...

随机推荐

  1. C#利用Attribute实现简易AOP介绍 (转载)

    地址:http://dotnet.9sssd.com/csbase/art/638 http://wayfarer.blog.51cto.com/1300239/279913 http://devel ...

  2. 封装js千分位加逗号和删除逗号

    //封装js千分位加逗号和删除逗号 alert( format(2545678754.020001) ) //2,545,678,754.03 alert( format(-2545678754.02 ...

  3. 高可用工具keepalived学习笔记

    keepalived完全遵守VRRP协议包括竞选机制,至于VRRP是什么这里不说了参考http://wenku.baidu.com/link? url=1UbkmHuQlGECgC90P7zF6u2x ...

  4. HBase分布式安装

    安装HBase之前需要先安装Hadoop,因为HBase是运行在Hadoop集群上的.安装Hadoop可以参照http://www.cnblogs.com/stGeekpower/p/3307289. ...

  5. dede 单表模型动态浏览设置 arclistsg arc.sglistview.class.php

    比如,分类信息,内容页默认都是生成静态的,如果有需要设为动态访问的,可以参考如下方法: arclistsg 标签,单表独立模型的文档列表调用标记 方法一: 在arclist标签使用中,其对应主表ded ...

  6. java中4中类修饰符访问范围

    public:本类中可见,同包中可见,子类中可见,其他包中可见. protected:本类中可见,同包中可见,子类中可见,其他包不可见. 默认:本类中可见,同包中可见,子类不可见,其他包不可见. pr ...

  7. paypal api 相关资料

    https://developer.paypal.com/ https://developer.paypal.com/docs/classic/api/merchant/GetBalance_API_ ...

  8. jquery mobile最棘手的一个问题

    大多数jquery mobile开发的妹子们都碰到过这个问题: 如何调用loading效果   这里给出一段代码,赶紧练手吧. //显示loading function showLoading(){ ...

  9. Python 初学(一) 标识符

    Python 标识符 在python里,标识符由字母.数字.下划线组成: python中的标识符是区分大小写的: 1)以单下划线开头(_foo)的代表不能直接访问的类属性,需要通过类提供的接口进行访问 ...

  10. Python脚本控制的WebDriver 常用操作 <十一> 操作测试对象

    下面将使用WebDriver来模拟键盘的输入操作,以及复习上节的层对象操作 测试用例场景 定位到具体的对象后,我们就可以对这个对象进行具体的操作,比如先前已经看到过的点击操作(click).一般来说, ...