题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4127

题目意思:

给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相连(颜色相同以及相邻,间接也行)的所有的格子都为该颜色。求最少的步数,使得所有的方格颜色都相同。

解题思路:

bfs+bfs死活不给过。

正确解法应该是ID(dfs+bfs).因为总共的解的步数不多。

减枝:

1、当剩余的颜色种数(至少还要这么多步)+已走的步数>设定深度时 跳出。

2、注意每次搜的时候保证比前面的方格数多。

PS:时间卡的紧,不用STL,用手写队列。

代码:

  1. #include<iostream>
  2. #include<cmath>
  3. #include<cstdio>
  4. #include<cstdlib>
  5. #include<string>
  6. #include<cstring>
  7. #include<algorithm>
  8. #include<vector>
  9. #include<map>
  10. #include<set>
  11. #include<stack>
  12. #include<list>
  13. #include<queue>
  14. #include<ctime>
  15. #define eps 1e-6
  16. #define INF 0x3f3f3f3f
  17. #define PI acos(-1.0)
  18. #define ll __int64
  19. #define lson l,m,(rt<<1)
  20. #define rson m+1,r,(rt<<1)|1
  21. #pragma comment(linker, "/STACK:1024000000,1024000000")
  22. using namespace std;
  23.  
  24. #define Maxn 10
  25. int sa[Maxn][Maxn],n,ans,dep;
  26. int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
  27. bool flag;
  28.  
  29. struct Po
  30. {
  31. int x,y;
  32. }q[80];
  33.  
  34. struct Inf
  35. {
  36. int cnt;
  37. Po pp[70];
  38. }; //存储一个连通块内的所有节点
  39. bool vis[Maxn][Maxn];
  40. bool iscan(int x,int y) //判断是否越界
  41. {
  42. if(x<=0||x>n||y<=0||y>n)
  43. return false;
  44. return true;
  45. }
  46. void bfs(Inf & s,int co[])
  47. {
  48. memset(vis,false,sizeof(vis));
  49. //queue<Inf>myq;
  50. s.cnt=0;
  51. Po tmp;
  52. tmp.x=1,tmp.y=1;
  53. s.pp[++s.cnt]=tmp;
  54. vis[1][1]=true;
  55. //myq.push(s);
  56. int head=0,tail=-1;
  57. q[++tail]=tmp;
  58.  
  59. while(head<=tail)
  60. {
  61. //Inf cur=myq.front();
  62. //myq.pop();
  63. Po cur=q[head];
  64. ++head;
  65.  
  66. int xx=cur.x,yy=cur.y;
  67. for(int i=0;i<4;i++)
  68. {
  69. int x=xx+dir[i][0],y=yy+dir[i][1];
  70. if(!iscan(x,y)||vis[x][y]||sa[x][y]!=sa[xx][yy])
  71. continue;
  72. vis[x][y]=true;
  73. Po tt;
  74. tt.x=x,tt.y=y;
  75. s.pp[++s.cnt]=tt;
  76. //myq.push(s);
  77. q[++tail]=tt;
  78. }
  79. }
  80. for(int i=1;i<=n;i++) //统计还没有进入连通块内的颜色种数
  81. for(int j=1;j<=n;j++)
  82. {
  83. if(!vis[i][j])
  84. co[sa[i][j]]++;
  85. }
  86.  
  87. }
  88. void dfs(int co,int step,int num) //当前颜色,已走步数,已联通的方格个数
  89. {
  90. if(step>dep||flag)
  91. return ;
  92. int cc[6]={0};
  93. Inf tmp;
  94. bfs(tmp,cc);
  95. if(tmp.cnt<=num)//往多的方格搜,不然浪费步数
  96. return ;
  97. num=tmp.cnt;
  98. //printf(":%d\n",num);
  99. //system("pause");
  100. if(num==n*n) //找到了
  101. {
  102. flag=true;
  103. ans=step;
  104. return ;
  105. }
  106. int nn=0;
  107. for(int i=0;i<6;i++)
  108. if(cc[i])
  109. nn++;
  110. if(nn+step>dep) //至少要这么多步
  111. return ;
  112. for(int i=0;i<6;i++)
  113. {
  114. if(i==co)
  115. continue;
  116. for(int j=1;j<=tmp.cnt;j++)
  117. sa[tmp.pp[j].x][tmp.pp[j].y]=i;
  118. dfs(i,step+1,num);
  119. for(int j=1;j<=tmp.cnt;j++) //回溯
  120. sa[tmp.pp[j].x][tmp.pp[j].y]=co;
  121. }
  122.  
  123. }
  124. void IDA()
  125. {
  126. flag=false;
  127. dep=1;
  128. while(!flag) //迭代加深搜索
  129. {
  130. dfs(sa[1][1],0,0);
  131. ++dep;
  132. }
  133. }
  134.  
  135. int main()
  136. {
  137. while(scanf("%d",&n)&&n)
  138. {
  139. for(int i=1;i<=n;i++)
  140. for(int j=1;j<=n;j++)
  141. scanf("%d",&sa[i][j]);
  142. IDA();
  143. printf("%d\n",ans);
  144. }
  145. return 0;
  146. }

ID(dfs+bfs)-hdu-4127-Flood-it!的更多相关文章

  1. POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE

    POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...

  2. Leetcode题目104.二叉树的最大深度(DFS+BFS简单)

    题目描述: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...

  3. [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)

    695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...

  4. HDU 3313 Key Vertex(dfs + bfs)

    HDU 3313 Key Vertex 题目链接 题意:一个有向无环图.求s,t之间的割点 思路:先spfa找一条最短路出来,假设不存在.就n个都是割点. 然后每次从s进行dfs,找到能经过最短路上的 ...

  5. 第三次组队赛 (DFS&BFS)

    网站:CSUST 8月1日 先总结下,不得不说死的很惨,又是第三就不说了,一共7道题,AC了5道,但是有一个组三个人是做的个人赛,有两人AK了.......Orz,然后深搜还是大问题,宽搜倒是不急了. ...

  6. poj 3083 Children of the Candy Corn(DFS+BFS)

    做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...

  7. 最少步数(dfs + bfs +bfs优化)

    最少步数 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 这有一个迷宫,有0~8行和0~8列: 1,1,1,1,1,1,1,1,1 1,0,0,1,0,0,1,0,1 ...

  8. POJ 1426 Find The Multiple (DFS / BFS)

    题目链接:id=1426">Find The Multiple 解析:直接从前往后搜.设当前数为k用long long保存,则下一个数不是k*10就是k*10+1 AC代码: /* D ...

  9. Leetcode之深度+广度优先搜索(DFS+BFS)专题-934. 最短的桥(Shortest Bridge)

    Leetcode之广度优先搜索(BFS)专题-934. 最短的桥(Shortest Bridge) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...

随机推荐

  1. New Year Table(几何)

    New Year Table Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Sub ...

  2. [CSS3] CSS Display Property: Block, Inline-Block, and Inline

    Understanding the most common CSS display types of block, inline-block, and inline will allow you to ...

  3. Cookie同域,跨域单点登录(转)

    Cookie 同域单点登录 最近在做一个单点登录的系统整合项目,之前我们使用控件实现单点登录(以后可以介绍一下).但现在为了满足客户需求,在不使用控件情况下实现单点登录,先来介绍一下单点登录. 单点登 ...

  4. git学习笔记(五)

    ---恢复内容开始--- 嗯 今天又看到一个非常不错的入门git教程 Mark一下 阮一峰Git操作详解 主要讲解了五个常用的git命令 git clone git remote git fetch ...

  5. NO.14 两个div并排,左边为绝对宽度,右边为相对宽度

    两个div并排,左边为绝对宽度,右边为相对宽度,这个问题,我也经常遇到,我一般的处理方法是将最大的容器padding-left固定宽度,左边的固定宽度的一块position:absolute,然后ri ...

  6. OutputCache各参数的说明

    OutputCache各参数的说明 Duration 缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的. Location Location当被设置为 ...

  7. 创建一个简单的配置android编译环境的脚本

    由于有多个Android项目,每个项目配置编译环境时选项都不同,所以尝试写一个sh脚本来完成这个功能.     首先进入bin文件夹,新建一个文件enbuild $ cd ~/bin $ touch ...

  8. IOS自适应库---- Masonry的使用

    Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS ...

  9. 1203.3——循环语句 之 while

    while循环 while循环的一般形式为:    while(表达式){        语句块    }其中表达式称为循环条件,语句块称为循环体. while语句的意思是:先计算表达式的值,当值为真 ...

  10. struts2 标签

    一.逻辑控制标签 用于进行逻辑控制输出.主要分以下几类: 1)条件标签:用于执行基本的条件流转 <s:if>:拥有一个test属性,其表达式的值用来决定标签里内容是否显示.<s:if ...