http://codevs.cn/problem/2495/ (题目链接)

题意

  给出一个N*N的矩阵,其中元素有5种颜色,每次可以将左上角元素所在的连通块更换一种颜色,连通块指相邻并且颜色相同的元素在同一连通块内。问最少改变几次颜色使得所有元素颜色相同。

Solution

  刚开始打了个迭代加深,get了20分。。。考虑如何对它进行优化。

  一个很显然的优化就是染色的时候,只对连通块周围的属于连通块的一圈元素进行扩展,并保存下染色后新的外圈元素。

  可是仅仅这样还是不够,只能get50分。

  考虑A*,如何构造估价函数呢。显然,如果剩下的不属于连通块的元素有cnt种不同的颜色,那么至少还需要染色cnt次,那么如果cnt+当前步数>枚举深度d,显然这样走下去不会出答案,直接退出即可。

细节

  细节有点恶心,刚开始我用的bfs实现染色操作,然后回溯还有各种不好做的操作,就直接翻了题解。。真是很优美。。

代码

// codevs2495
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; int xx[4]={0,0,-1,1};
int yy[4]={1,-1,0,0};
int a[10][10],vis[10][10],e[6];
int n,flag,d; void color(int x,int y,int col) {
vis[x][y]=1;
for (int i=0;i<4;i++) {
int nx=x+xx[i],ny=y+yy[i];
if (nx<1 || nx>n || ny<1 || ny>n || vis[nx][ny]==1) continue;
vis[nx][ny]=2;
if (a[nx][ny]==col) color(nx,ny,col);
}
}
int eva(int s) {
int cnt=0;
memset(e,0,sizeof(e));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (vis[i][j]!=1 && !e[a[i][j]]) e[a[i][j]]=1,cnt++;
return cnt;
}
bool judge(int col) {
int tmp=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) if (a[i][j]==col && vis[i][j]==2) {
tmp++;
color(i,j,col);
}
return tmp>0;
}
void search(int s) {
int tmp=eva(s),t[10][10];
if (tmp==0) {flag=1;return;}
else if (tmp+s>d) return;
for (int i=0;i<=5;i++) {
memcpy(t,vis,sizeof(t));
if (judge(i)) search(s+1);
memcpy(vis,t,sizeof(vis));
if (flag) return;
}
}
int main() {
while (scanf("%d",&n)!=EOF && n) {
flag=0;memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
color(1,1,a[1][1]);
for (d=0;d>=0;d++) {
search(0);
if (flag) {printf("%d\n",d);break;}
}
}
return 0;
}

  

【codevs2495】 水叮当的舞步的更多相关文章

  1. [codevs2495]水叮当的舞步

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

  2. codevs2495 水叮当的舞步 IDA*

    我打暴力不对,于是就看看题解,,,,,,IDA*就是限制搜索深度而已,这句话给那些会A*但不知道IDA*是什么玩意的小朋友 看题解请点击这里 上方题解没看懂的看看这:把左上角的一团相同颜色的范围,那个 ...

  3. codevs 2495 水叮当的舞步

    题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...

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

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

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

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

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

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

  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. 【codevs2495】水叮当的舞步

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

  10. Bzoj3041 水叮当的舞步

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

随机推荐

  1. 开发者调试工具Chrome Workspace

    Workspace是个什么样的东西呢?他能够在开发者工具中调试修改js或者css同时自动保存文件,能够避免开发人员在工具中调试好,再到编辑器中修改一次代码的重复操作,能够提高一定的效率 配置Chrom ...

  2. 我们为什么要使用maven,公司推行maven杂谈

    最近在公司内推荐使用maven,推荐一个落后于业内十年的技术,实在没什么好说的,可是没想到遇到了前所未有的阻力,总是听到各种各样的质疑,我就闹不明白了,推行这个东西是为了更规范的管理项目成果,方便大家 ...

  3. C#实现在图片上斜着写字

    最近公司要搞微信活动页面,要实现图片上可以写自己名字的功能,于是就查了一下怎么实现,下面贴一下代码备忘,希望大家也能用到: 我是在控制台应用程序里进行试验的. using (Image bitmap ...

  4. Linux SSH登录慢案例分析

    手头有台Linux服务器ssh登录时超级慢,需要几十秒.其它服务器均没有这个问题.平时登录操作都默默忍了.今天终于忍不住想搞清楚到底什么原因.搜索了一下发现了很多关于ssh登录慢的资料,于是自己也学着 ...

  5. 深度解析mysql登录原理

    使用mysql数据库的第一步必然是建立连接登录,然后在上面执行SQL命令.无论是通过mysql的客户端,还是通过C-API,JDBC标准接口连接数据库,这个过程一定少不了.今天我们聊一聊mysql登陆 ...

  6. 【转】What is an SDET

    What is an SDET? SDET stands for Software Development Engineer in Test (or Software Design Engineer ...

  7. Microsoft Azure Point to Site VPN替代方案

    Microsoft Azure提供了Point to Site VPN,但有时候这并不能满足我们的需求,例如:Point to Site VPN是SSTP VPN,只能支持Window客户端拨入,而且 ...

  8. (转)浅析Java中的访问权限控制

    原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...

  9. 三维网格补洞算法(Poisson Method)

    下面介绍一种基于Poisson方程的三角网格补洞方法.该算法首先需要根据孔洞边界生成一个初始化补洞网格,然后通过法向估算和Poisson方程来修正补洞网格中三角面片的几何形状,使其能够适应并与周围的原 ...

  10. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...