题目链接:水叮当的舞步

  我现在开始发题目链接了(主要还是因为懒得整理题面)……

  这道题一开始是看到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 水叮当的舞步的更多相关文章

  1. 【IDA*】codevs 2495:水叮当的舞步

    2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...

  2. codevs 2495 水叮当的舞步IDA*

    /* 比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数 加上迭代 好像答案最多在16步之内出解 这样裸裸的交上去是50分 在考虑剪枝 每个选颜色的时候一定是选左上角联通快附近的颜色 ...

  3. 【wikioi】2495 水叮当的舞步(IDA*)

    http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...

  4. bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 44[Submit][Status] Descript ...

  5. 【BZOJ3041】水叮当的舞步 迭代深搜IDA*

    [BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...

  6. [codevs2495]水叮当的舞步

    [codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...

  7. bzoj3041 水叮当的舞步 IDA*

    水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 230  Solved: 107[Submit][Status][Discuss] Des ...

  8. BZOJ 3041 水叮当的舞步

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 67[Submit][Status][Discuss ...

  9. Bzoj3041 水叮当的舞步

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 132  Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...

随机推荐

  1. spring入门(六)【springMVC中各数据源配置】

    在使用spring进行javaWeb开发的过程中,需要和数据库进行数据交换,为此要经常获取数据库连接,使用JDBC的方式获取数据库连接,使用完毕之后再释放连接,这种过程对系统资源的消耗无疑是很大的,这 ...

  2. c# json序列化 意外字符i 意外字符ï 解决方案

    今天使用DataContractJsonSerializer遇到了这个问题 这是个蛋疼的问题,折腾了我好久,反复检查对象和json字符串,没发现什么问题,而且错误提示还看走眼了,是ï不是i 现公布解决 ...

  3. java web学习总结(二) -------------------TOMCAT使用帮助(一)

    一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...

  4. hadoop 集群的配置

    在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...

  5. iOS之开发支付功能概述

    前言:本随笔将对IOS开发的支付功能进行一个概述. 内容大纲: 一.常见的支付方案简介 二.第三方支付SDK 三.苹果官方支付方案 四.Web支付方案 正文: 一.常见的支付方案简介 在微信支付中 微 ...

  6. DEDE建站之图片标签技巧指南

    做dede站的时候,曾经遇到很苦恼的事情,就是给图片集添加了一个网上下载下来的特效,需要给图片的链接上添加一个rel属性,供JS调用以达到那种特效.但是当时只知道dede的图片链接标签是[field: ...

  7. Android编码规范04

    private final String MESSAGE_WARN = "您输入的密码有误,请重新输入!"; private final String CLASS_ONE = &q ...

  8. Android measure过程分析

    作为一名Android开发人员,我们都知道一个View从无到有,会经历3个阶段: 1. measure/测量阶段,也就是确定某个view大小的过程: 2. layout/布局阶段,也就是确定其左上右下 ...

  9. Git 常见的命令操作

    克隆                git clone git地址 查看分支         git branch 查看git库状态  git status 切换分支         git  che ...

  10. 教你开发asp.net的单点登录系统

    单点登录系统,简称SSO.以下是我花了几个小时写的一个简单实现.特把实现思路和大家分享. 背景:某项目使用ASP.NET MemberShip来做会员系统,需要同时登录多个系统.而项目的开发人员无法在 ...