【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 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...
随机推荐
- c语言学习的第10天
#include <stdio.h> int main() { int many; printf("你想看几次?"); scanf("%d",&am ...
- reader,字符流
1. public class Demo1 { public static void main(String[] args) throws IOException { File file = new ...
- [转]给C++初学者的50个忠告
1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Prog ...
- Simple Shopping Cart By AngularJS
<body ng-controller='CartController'> <h1>Your Order</h1> <div ng-repeat='item ...
- 第四节:监视AppDomain
宿主应用程序可监视AppDomain消耗的资源.有的宿主根据这种信息判断一个AppDomain的内存或CPU消耗是否超过了应有的水准,并强制卸载一个AppDomain. 还可以利用监视来比较不同算法的 ...
- SQL Server 一些关键字详解(二)
1.LEFT JOIN 容易让人误解的地方 背景:因为在网上搜了下 LEFT JOIN 和 OUTER APPLY 的区别,时发现,有的网友解释为: 1) A left join B 的连接 ...
- java获取数据库里表的名字
一.Java方法 // 得到当前数据库下所有的表名 public void getTableNameByCon(Connection con) { try { DatabaseMetaData met ...
- oracle 查询今天哪个表增加的数据多
一.创建一个表 create table A( TABLE_NAME VARCHAR2(200), COUNT_NUM NUMBER) 二.创建一个存储过程create or replace ...
- Android工具与其它
文本文件: Tool: NotePad++ 代码工具: Tool:Eclipse+STAN+(乱七八糟c,c++,java,android),Source Insight 3 Log工具: Tool: ...
- Linux系统木马后门查杀方法详解
木马和后门的查杀是系统管理员一项长期需要坚持的工作,切不可掉以轻心.以下从几个方面在说明Linux系统环境安排配置防范和木马后门查杀的方法: 一.Web Server(以Nginx为例) 1.为防止跨 ...