【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
每个测试点包含多组数据。
每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
N=0代表输入的结束。
对于每组数据,输出一个整数,表示最少步数。
2
0 0
0 0
3
0 1 2
1 1 2
2 2 1
0
0
3
对于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:水叮当的舞步的更多相关文章
- codevs 2495 水叮当的舞步
题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...
- codevs 2495 水叮当的舞步IDA*
/* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...
- 【wikioi】2495 水叮当的舞步(IDA*)
http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...
- bzoj3041 水叮当的舞步 IDA*
水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 230 Solved: 107[Submit][Status][Discuss] Des ...
- 【BZOJ3041】水叮当的舞步 迭代深搜IDA*
[BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...
- BZOJ 3041 水叮当的舞步
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 67[Submit][Status][Discuss ...
- bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 44[Submit][Status] Descript ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- Bzoj3041 水叮当的舞步
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 132 Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...
随机推荐
- MongoDB 相关下载
MongoDB 下载:http://www.mongodb.org/ 本实例中MongoDB的C#驱动,支持linq:https://github.com/samus/mongodb-csharp M ...
- 图片加载与缓存利器(自动缓存)--第三方开源-- Glide
Android Glide使用便利,短短几行简单明晰的代码,即可完成大多数图片从网络(或者本地)加载.显示的功能需求. 使用Android Glide,需要先下载Android Glide的库,And ...
- Nginx安装第二步手动下载依赖包
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环 ...
- cxGrid使用汇总(一)
1. 去掉cxGrid中台头的Box 解决:在tableview1的ptionsview的groupbybox=false; 2.统计功能 解决:(1) tableview 1. tableview1 ...
- 【Delphi】注册快捷键
ShortCutToText , TextToShortCut 需 uses Menus; type TForm1 = class(TForm) HotKey1: THotKey; Button1: ...
- ok6410的DMA裸机总结
1.为何使用DMA:为了提高CPU的工作效率,避免多余的等待时间 2.关于DMA控制器:(1)通道数:2440有4个通道,6410有4个DMA控制器(初始化的时候要选择),32个通道.210有两种DM ...
- AngularJs记录学习03
AngularJs的路由是一个组件,需要自己额外添加,在目录/src/ngRoute中 三个文件route.js,routeParams.js,ngView.js <html> <h ...
- jqGrid(2)
jqGrid使用方法: 原文地址:http://blog.csdn.net/y0ungroc/article/details/12008879 1. 下载文件 1. 下载jqGrid的软件包, ...
- ubuntun pptpd
apt-get install pptpd 3.编辑pptpd.conf文件 vi /etc/pptpd.conf 取消注释下面内容 option /etc/ppp/pptpd-options loc ...
- EMVTag系列6《IAC 发卡行行为代码》
R(需求):数据应存在,在读应用数据过程中,终端不检查:将变成必备 L: 5 IAC 的值,最好不要自定义,最好和所选的模板完全匹配.如果修改持卡人认证位,PIN Bypass 相关的位.如果有业务需 ...