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. winform自动添加同级目录下可执行文件的快捷方式到右键菜单中

    /// <summary> /// 追加同目录下可执行文件到右键菜单中 /// 在form的Load事件中调用:new clsContextMenuStrip(this.FindForm( ...

  2. Win7下 httpRequest带证书请求https网站

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

  3. freefilesync 7 使用

    官方下载地址:http://www.freefilesync.org/download.php 1.打开FreeFileSync 设置左右的文件夹,设置过滤规则,设置同步方式(双向.单向),执行同步 ...

  4. 无需server-U IIS7.5 在已有的多个WEB网站上配置FTP发布

    1 新建一个用于ftp登陆的计算机用户. 操作:开始→管理工具→计算机管理→本地用户和组→用户,新建一个计算机用户,设置好用户名和密码,例如:nenkea nkscl 2 在web站点文件夹下,把新建 ...

  5. .Net并行编程

    1.什么是线程?线程和进程的区别是什么? 线程是程序执行的最小单元. 区别: 进程是操作系统进行资源处理和分配的最小单位,而一个进程可以包含多个线程,并共享进程的资源. 2.什么是多线程?为什么设计多 ...

  6. 在openSUSE13.2上gem install rails -v 4.1成功,但是之后不存在rails命令解决

    解决方案为,不要用sudo gem install就好了,卧槽

  7. c,c++函数返回多个值的方法

    最近遇到一个问题,需要通过一个函数返回多个值.无奈C,C++不能返回多个值.所以就想有什么方法可以解决. 网上方法比较杂乱,一般有两种替代做法: 1. 利用函数的副作用, 返回值在函数外定义, 在函数 ...

  8. linux log find 查询

    常用的日志查询命令:find 1.从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行: find / -type f -name "*.log" | xa ...

  9. Sql Server数据的加密与解密

    Sql Server数据的加密与解密 在sql server中,我们如何为数据进行加密与解密,避免使用者窃取机密数据? 对于一些敏感数据,如密码.卡号,一般不能使用正常数值来存储.否则会有安全隐患.以 ...

  10. UITextField使用的相关方法

    1.设置占位符 textField.placeholder = @“”; 2.设置暗文输入 textField.secureTextEntry = YES;   3.设置键盘类型 textField. ...