codevs 2495 水叮当的舞步
题目链接:水叮当的舞步
我现在开始发题目链接了(主要还是因为懒得整理题面)……
这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)……
这道题看到这么小的范围当然给人的第一感觉就是搜索了。于是我果断写了个搜索,后果很惨……我都没敢交上去……
后来想了各种优化,一路优化到了$80$分。最后的我想不出来了,于是就去翻了题解,终于弄全了。
首先,这道题最好使用迭代加深搜索。因为普通的$dfs$太慢,而$bfs$空间又开不下(听说某位大神使用$bfs$切掉了)。
接下来就是各种剪枝。每次都要对左上角的联通块进行拓展,这一步很耗时间。于是我们可以考虑给每个格子染上色,已经在左上角联通块内的染为$1$,在边上的染为$2$,其余的就是$3$了。于是每次拓展的时候我们只需可以找出所有颜色为$2$(是我们自己染上的颜色)的格子进行拓展即可。
然后我们可以对当前状态进行估价。设联通块外的颜色(输入的颜色)数为$x$,那么至少需要$x$步才可以让剩下的格子颜色相同。减掉一批。
另外还剩下一个,那就是当改变颜色后左上角联通块大小没有改变,那么这一步染色是无效的,可以直接减掉。
大概就是这些了。这道题用到了估价函数,那么就是$A*$搜索?
下面贴代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
- #define N 9
- using namespace std;
- int a[N][N],n,now;//a数组是输入的颜色,co数组是我自己染的颜色
- int co[N][N],ans,yan[6],sheng;//yan数组标记剩下的每种颜色的数目,sheng就是剩余的不同种类颜色数
- int zx[4]={1,-1,0,0},zy[4]={0,0,1,-1};
- void color(int x,int y){//将(x,y)所在联通块纳入左上角联通块
- if(!(--yan[a[x][y]])) sheng--;
- co[x][y]=1; now++;
- for(int k=0,i,j;k<4;k++){
- i=x+zx[k],j=y+zy[k];
- if(i>=1 && i<=n && j>=1 && j<=n && co[i][j]!=1){
- if(a[i][j]==a[x][y]) color(i,j);
- else co[i][j]=2;
- }
- }
- }
- bool pd(int x){//判断联通块大小是否改变,顺便进行染色
- bool ww=0;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++)
- if(co[i][j]==2 && a[i][j]==x)
- color(i,j),ww=1;
- return ww;
- }
- bool dfs(int d){
- if(sheng>d) return 0;
- if(now==n*n) return 1;
- if(!d) return 0;
- int zan[N][N],col[6],nn=now,ns=sheng;
- for(int i=0;i<6;i++){
- memcpy(zan,co,sizeof(co));
- memcpy(col,yan,sizeof(yan));
- if(pd(i)){
- if(dfs(d-1)) return 1;
- memcpy(co,zan,sizeof(co));
- memcpy(yan,col,sizeof(yan));
- now=nn;sheng=ns;
- }
- }
- return 0;
- }
- int main(){
- File("a");
- while(scanf("%d",&n)==1 && n){
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++){
- scanf("%d",&a[i][j]);
- co[i][j]=3;
- }
- now=sheng=0; color(1,1); yan[a[1][1]]=0;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++)
- if(co[i][j]!=1) if(!(yan[a[i][j]]++)) sheng++;
- for(ans=0;;ans++)
- if(dfs(ans)){
- printf("%d\n",ans);
- break;
- }
- }
- return 0;
- }
codevs 2495 水叮当的舞步的更多相关文章
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- codevs 2495 水叮当的舞步IDA*
/* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...
- 【wikioi】2495 水叮当的舞步(IDA*)
http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...
- bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 44[Submit][Status] Descript ...
- 【BZOJ3041】水叮当的舞步 迭代深搜IDA*
[BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- bzoj3041 水叮当的舞步 IDA*
水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 230 Solved: 107[Submit][Status][Discuss] Des ...
- BZOJ 3041 水叮当的舞步
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 67[Submit][Status][Discuss ...
- Bzoj3041 水叮当的舞步
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 132 Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...
随机推荐
- 【JAVA并发编程实战】10、并发程序的测试
1.产生随机数 package cn.study.concurrency.ch12; public class Util { public static int xorShift(int y) { / ...
- AngularJS Directive 隔离 Scope 数据交互
什么是隔离 Scope AngularJS 的 directive 默认能共享父 scope 中定义的属性,例如在模版中直接使用父 scope 中的对象和属性.通常使用这种直接共享的方式可以实现一些简 ...
- 初识HTML
前面的话 HTML文档的后缀一般都是.html,但是在以前,.htm后缀也是不少的,它们都代表html文档,实际上也没有本质的区别.htm是在win32时代,系统只能识别3位扩展名时使用的.现在一般都 ...
- sass初级语法
github地址:https://github.com/lily1010/sass/tree/master/course01 用到的sass语法是: sass --watch test.scss:te ...
- IIS10中使用OpenSSL来创建CA并且签发SSL证书
参考: http://www.cnblogs.com/lierle/p/5140187.html http://alvinhu.com/blog/2013/06/12/creating-a-certi ...
- SharePoint 2013 状态机工作流之UpdateItemActivity
没什么可说的,一个Activity的使用介绍,其他类似的Activity也可以参考这个使用. 1.添加ApplyActivation和UpdateItemActivity,在onWorkflowAct ...
- string中Insert与Format效率对比、String与List中Contains与IndexOf的效率对比
关于string的效率,众所周知的恐怕是“+”和StringBuilder了,这些本文就不在赘述了.关于本文,请先回答以下问题(假设都是基于多次循环反复调用的情况下):1.使用Insert与Forma ...
- Android进度条学习
自定义属性 <!-- roundColor 圆环的颜色 roundProgressColor 进度的颜色 roundWidth 圆环的宽度 textColor 文字颜色 textSize 文字大 ...
- android 传感器应用
本章讲述Android开发中,传感器应用相关的知识点. 1.功能需求 做一个基于传感器的水平尺应用. 2.软件实现
- 设计模式 之 命令(Command)模式
命令模式: 命令模式是对命令的封装.它将发出的命令的责任和执行的命令分隔开,委派给不同的对象.被委派的对象虽然具有执行的命令,但只有在接收到命令后,才会执行命令. 下面是命令模式的结构图: 命令模式涉 ...