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

题意

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

Solution

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

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

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

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

细节

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

代码

  1. // codevs2495
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<cmath>
  8. #include<queue>
  9. #define LL long long
  10. #define inf 2147483640
  11. #define Pi acos(-1.0)
  12. #define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
  13. using namespace std;
  14.  
  15. int xx[4]={0,0,-1,1};
  16. int yy[4]={1,-1,0,0};
  17. int a[10][10],vis[10][10],e[6];
  18. int n,flag,d;
  19.  
  20. void color(int x,int y,int col) {
  21. vis[x][y]=1;
  22. for (int i=0;i<4;i++) {
  23. int nx=x+xx[i],ny=y+yy[i];
  24. if (nx<1 || nx>n || ny<1 || ny>n || vis[nx][ny]==1) continue;
  25. vis[nx][ny]=2;
  26. if (a[nx][ny]==col) color(nx,ny,col);
  27. }
  28. }
  29. int eva(int s) {
  30. int cnt=0;
  31. memset(e,0,sizeof(e));
  32. for (int i=1;i<=n;i++)
  33. for (int j=1;j<=n;j++)
  34. if (vis[i][j]!=1 && !e[a[i][j]]) e[a[i][j]]=1,cnt++;
  35. return cnt;
  36. }
  37. bool judge(int col) {
  38. int tmp=0;
  39. for (int i=1;i<=n;i++)
  40. for (int j=1;j<=n;j++) if (a[i][j]==col && vis[i][j]==2) {
  41. tmp++;
  42. color(i,j,col);
  43. }
  44. return tmp>0;
  45. }
  46. void search(int s) {
  47. int tmp=eva(s),t[10][10];
  48. if (tmp==0) {flag=1;return;}
  49. else if (tmp+s>d) return;
  50. for (int i=0;i<=5;i++) {
  51. memcpy(t,vis,sizeof(t));
  52. if (judge(i)) search(s+1);
  53. memcpy(vis,t,sizeof(vis));
  54. if (flag) return;
  55. }
  56. }
  57. int main() {
  58. while (scanf("%d",&n)!=EOF && n) {
  59. flag=0;memset(vis,0,sizeof(vis));
  60. for (int i=1;i<=n;i++)
  61. for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
  62. color(1,1,a[1][1]);
  63. for (d=0;d>=0;d++) {
  64. search(0);
  65. if (flag) {printf("%d\n",d);break;}
  66. }
  67. }
  68. return 0;
  69. }

  

【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. 【代码笔记】iOS-获取系统完成任务所需的后台时间

    一,代码. AppDelegate.h #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplica ...

  2. mac osx get postgresql path

    sudo lsof -i :5433 ps xuwww -p 91 sudo port install py27-psycopg2

  3. git 远程仓库-github

    第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步.如果没有,打开Shell ...

  4. VSALM 动手实验 - 持续集成

    Visual Studio 应用生命周期管理(VSALM - Visual Studio Application Lifecycle Managemnet)是微软基于Visual Studio产品线所 ...

  5. mysql5.7.1 zip版本安装记录

    很久没遇到使用mysql的项目了,今天下载了个,发现变了很多,搜索了下,发现按http://www.cnblogs.com/wenthink/p/MySQLInstall.html中提到的基本可以使用 ...

  6. oracle 使用 dbms_lock.sleep暂停存储过程执行

    grant execute on dbms_lock to USERNAME;   dbms_lock.sleep(time)参数单位为秒   create or replace procedure ...

  7. PostgreSQL-constraint

    CREATE TABLE语法CREATE [[ GLOBAL | LOCAL ]{ TEMPORARY | TEMP }] TABLE table_name ({ column_name data_t ...

  8. Javascript 中的严格模式

    原文:http://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html 一.概述 除了正常运行模式,ECMAscript 5添加了第 ...

  9. gcc中__builtin_return_address和__VA_ARGS__

    — Built-in Function: void * __builtin_return_address (unsigned int level) This function returns the ...

  10. Ural 1010. Discrete Function

    1010. Discrete Function Time limit: 1.0 secondMemory limit: 64 MB There is a discrete function. It i ...