【JZOJ3422】水叮当的舞步
description
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,地毯左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
analysis
正解IDA∗IDA*IDA∗,涨知识了
IDDFSIDDFSIDDFS就是迭代加深搜索,具体就是限制搜索树的深度,听着慢但很快
A∗A*A∗就是由当前步数加上估价函数来搜索,通常用堆实现
首先每次搜索前把图染色,111标记当前颜色的联通块,222标记当前颜色联通块外边界上的点,剩下点标记000
估价函数取剩下与当前联通块颜色不同的颜色数量,若为000即整张图已经被染成一种颜色
如果当前步数加估价函数大于限制的深度,就returnreturnreturn
搜索中枚举一种颜色染色,如果联通块大小没有变化,那这次染色就没有意义
这样就可以解决问题了,那么以后还要多掌握一些偏门知识
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)using namespace std;ll fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
ll a[10][10],b[10];
ll bz[10][10];
bool flag;
ll n,ans;inline ll read()
{ll x=0,f=1;char ch=getchar();while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
inline void color(ll x,ll y,ll z)
{bz[x][y]=1;fo(i,0,3){ll xx=x+fx[i],yy=y+fy[i];if (xx<1 || xx>n || yy<1 || yy>n || bz[xx][yy]==1)continue;bz[xx][yy]=2;if (a[xx][yy]==z)color(xx,yy,z);}
}
inline ll H()
{ll tmp=0;memset(b,0,sizeof(b));fo(i,1,n)fo(j,1,n)if (bz[i][j]!=1 && !b[a[i][j]])b[a[i][j]]=1,++tmp;return tmp;
}
inline bool judge(ll x)
{ll tmp=0;fo(i,1,n)fo(j,1,n)if (a[i][j]==x && bz[i][j]==2){++tmp,color(i,j,x);}return tmp>0;
}
inline bool a_star(ll x)
{ll tmp=H(),t[10][10];if (tmp==0)return 1;else if (tmp+x>ans)return 0;fo(i,0,5){memcpy(t,bz,sizeof(t));if (judge(i) && a_star(x+1))return 1;memcpy(bz,t,sizeof(bz));}return 0;
}
int main()
{freopen("T1.in","r",stdin);for (n=read();n!=0;n=read()){memset(bz,0,sizeof(bz)),flag=0;fo(i,1,n)fo(j,1,n)a[i][j]=read();color(1,1,a[1][1]);for (ans=0;ans<=n*n;++ans)if (a_star(0))break;printf("%lld\n",ans);}return 0;
}
【JZOJ3422】水叮当的舞步相关推荐
- [GMOJ]水叮当的舞步 From lydrainbowcat
水叮当的舞步 From lydrainbowcat 类型:IDA* (迭代加深启发式搜索) 方法一: 枚举每次选取了哪种颜色,然后找出左上角的格子所在的联通块,改变颜色. 为了避免来回改变.搜索深度过 ...
- 3422. 【NOIP2013模拟】水叮当的舞步
Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上 ...
- 【BZOJ】T3041 水叮当的舞步
题目链接: CODEVS 2495 水叮当的舞步 BZOJ 3041: 水叮当的舞步 这是道IDA*,迭代加深+估价剪枝: 首先考虑估价函数,一般情况下我们把易于计算的操作次数的下限作为A*的估价函数 ...
- codevs2495 水叮当的舞步(IDA*)
2495 水叮当的舞步 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 钻石 Diamond 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物, ...
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- codevs 2495 水叮当的舞步
Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上的 ...
- Bzoj3041 水叮当的舞步
Time Limit: 10 Sec Memory Limit: 128 MB Submit: 132 Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼 ...
- 【codevs2495】水叮当的舞步
题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~ ...
- 【wikioi】2495 水叮当的舞步(IDA*)
http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...
最新文章
- Python字符串截取值
- [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)
- Oracle学习计划
- 和QT零距离接触的意义是什么
- 对永磁无刷电机的调速过程
- css 弹性盒子200304
- XML SOAP应用简介
- c++语言编程,一个电灯两个开关控制,[理学]四川大学计算机学院精品课程_面向对象程序设计C++课件_游洪越_第一章绪论.ppt...
- AngularJs + angular-ui-router + bootstrap 实现blog基础导航功能
- Centos下面Eclipse打开文件闪退
- 小说APP源码—小说app开发如何做到小说APP系统快速搭建?
- 元宇宙终极目标是打造六界
- 盘点4种方法用Python批量提取[]括号内的第一个元素
- 【译】Unity3D Shader 新手教程(5/6) —— Bumped Diffuse Shader
- Spring Data JPA方法定义规范
- UVA - 1600 Patrol Robot (巡逻机器人)(bfs)
- 寻找你的热情(1)——检查自己所处的位置
- 硬件知识(二)无源RC二阶滤波电路
- email邮箱登陆验证实例
- 【FLASK】发送QQ邮件