我打暴力不对,于是就看看题解,,,,,,IDA*就是限制搜索深度而已,这句话给那些会A*但不知道IDA*是什么玩意的小朋友

看题解请点击这里

上方题解没看懂的看看这:把左上角的一团相同颜色的范围,那个范围周围的一圈,和剩余范围分别用c[i][j]赋值为1,2,0。然后做IDA*,限制搜索深度,估值函数h为c[i][j]不为1的范围中的不同颜色数目,意思是至少要多少次才能达到要求。ans不断迭代,如果g+h>ans则退出,如果c数组全为1则说明找到方案。感觉IDA*比A*编程难度简单好多,不用建堆,不过就是比较难想出迭代加深的方案。

my code如下:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. int N,a[][],c[][],dx[]={,,-,},dy[]={,,,-},ans;
  6. bool flag,vis[];
  7. int astarh()
  8. {
  9. int i,j,t=; memset(vis,,sizeof(vis));
  10. for (i=;i<=N;++i) for (j=;j<=N;++j)
  11. if ((c[i][j]!=)&&(vis[a[i][j]]==))
  12. {vis[a[i][j]]=;t++;} return t;
  13. }
  14. void dfs(int x,int y)
  15. {
  16. int i,j,nowx,nowy;
  17. c[x][y]=;
  18. for (i=;i<;++i)
  19. {
  20. nowx=x+dx[i]; nowy=y+dy[i];
  21. if ((nowx<)||(nowx>N)||(nowy<)||(nowy>N)||(c[nowx][nowy]==)) continue;
  22. c[nowx][nowy]=; if (a[x][y]==a[nowx][nowy]) dfs(nowx,nowy);
  23. }
  24. }
  25. bool can(int k)
  26. {
  27. int i,j; bool p=;
  28. for (i=;i<=N;++i) for (j=;j<=N;++j)
  29. if ((c[i][j]==)&&(a[i][j]==k))
  30. {p=; dfs(i,j);} return p;
  31. }
  32. void work(int k)
  33. {
  34. int pd=astarh();
  35. if (k+pd>ans) return;
  36. if (pd==) {flag=;return;}
  37. int tm[][],i;
  38. for (i=;i<=;++i)
  39. {
  40. memcpy(tm,c,sizeof(c));
  41. if (can(i)) work(k+);
  42. memcpy(c,tm,sizeof(c));
  43. }
  44. }
  45. int main()
  46. {
  47. int i,j;
  48. scanf("%d",&N);
  49. while (N)
  50. {
  51. for (i=;i<=N;++i) for (j=;j<=N;++j) scanf("%d",&a[i][j]);
  52. memset(c,,sizeof(c)); dfs(,); flag=;
  53. for (ans=;ans<=N*N;++ans)
  54. {work(); if (flag) {printf("%d\n",ans);break;}}
  55. scanf("%d",&N);
  56. }
  57. return ;
  58. }

codevs2495 水叮当的舞步 IDA*的更多相关文章

  1. [codevs2495]水叮当的舞步

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

  2. bzoj3041 水叮当的舞步 IDA*

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

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

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

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

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

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

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

  6. BZOJ 3041 水叮当的舞步

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

  7. codevs 2495 水叮当的舞步

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

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

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

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

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

随机推荐

  1. Quicksum -SilverN

    quicksum Given a string of digits, find the minimum number of additions required for the string to e ...

  2. POJ 2263 Heavy Cargo 多种解法

    好题.这题可以有三种解法:1.Dijkstra   2.优先队列   3.并查集 我这里是优先队列的实现,以后有时间再用另两种方法做做..方法就是每次都选当前节点所连的权值最大的边,然后BFS搜索. ...

  3. python基础随笔

    一: 作用域 对于变量的作用域,只要内存中存在,该变量就可以使用. 二:三元运算 name = 值1 if 条件 else 值2 如果条件为真:result = 值1 如果条件为假:result = ...

  4. [原创]gerrit上分支操作记录(创建分支、删除分支)

    Git分支对于一个项目的代码管理而言,是十分重要的! 许多久用git的朋友可能已经掌握的很牢固了,但对于一些初涉git的童鞋来说,可能还不是很熟悉. 在此,我将自己的一些操作经历做一梳理,希望能帮助到 ...

  5. Android动画原理分析

    最近在Android上做了一些动画效果,网上查了一些资料,有各种各样的使用方式,于是乘热打铁,想具体分析一下动画是如何实现的,Animation, Animator都有哪些区别等等. 首先说Anima ...

  6. google project tango 学习笔记

    google io 2015上 project tango 的演示视频

  7. 入门Linux

    45分钟带你入门Linux(附:笔者在工作室开讨论班录制的视频讲解)   第一部分    熟悉Linux基本操作 一.初识Linux 1.Linux特点 ◊  开放性 ◊  多用户 ◊  多任务 ◊  ...

  8. 补鞋匠---Cobbler 服务器自动搭建

    Cobbler 服务器自动搭建http://tshare365.com/archives/439.html

  9. zabbix一件漂亮的外衣配置

    http://www.cnblogs.com/yyhh/archive/2015/09/08/4792830.html

  10. Linux 进程通信(共享内存区)

    共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段). 如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中. 如果一个进程更新了段中的数据,其他进程也 ...