ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=4127
题目意思:
给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相连(颜色相同以及相邻,间接也行)的所有的格子都为该颜色。求最少的步数,使得所有的方格颜色都相同。
解题思路:
bfs+bfs死活不给过。
正确解法应该是ID(dfs+bfs).因为总共的解的步数不多。
减枝:
1、当剩余的颜色种数(至少还要这么多步)+已走的步数>设定深度时 跳出。
2、注意每次搜的时候保证比前面的方格数多。
PS:时间卡的紧,不用STL,用手写队列。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; #define Maxn 10
int sa[Maxn][Maxn],n,ans,dep;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool flag; struct Po
{
int x,y;
}q[80]; struct Inf
{
int cnt;
Po pp[70];
}; //存储一个连通块内的所有节点
bool vis[Maxn][Maxn];
bool iscan(int x,int y) //判断是否越界
{
if(x<=0||x>n||y<=0||y>n)
return false;
return true;
}
void bfs(Inf & s,int co[])
{
memset(vis,false,sizeof(vis));
//queue<Inf>myq;
s.cnt=0;
Po tmp;
tmp.x=1,tmp.y=1;
s.pp[++s.cnt]=tmp;
vis[1][1]=true;
//myq.push(s);
int head=0,tail=-1;
q[++tail]=tmp; while(head<=tail)
{
//Inf cur=myq.front();
//myq.pop();
Po cur=q[head];
++head; int xx=cur.x,yy=cur.y;
for(int i=0;i<4;i++)
{
int x=xx+dir[i][0],y=yy+dir[i][1];
if(!iscan(x,y)||vis[x][y]||sa[x][y]!=sa[xx][yy])
continue;
vis[x][y]=true;
Po tt;
tt.x=x,tt.y=y;
s.pp[++s.cnt]=tt;
//myq.push(s);
q[++tail]=tt;
}
}
for(int i=1;i<=n;i++) //统计还没有进入连通块内的颜色种数
for(int j=1;j<=n;j++)
{
if(!vis[i][j])
co[sa[i][j]]++;
} }
void dfs(int co,int step,int num) //当前颜色,已走步数,已联通的方格个数
{
if(step>dep||flag)
return ;
int cc[6]={0};
Inf tmp;
bfs(tmp,cc);
if(tmp.cnt<=num)//往多的方格搜,不然浪费步数
return ;
num=tmp.cnt;
//printf(":%d\n",num);
//system("pause");
if(num==n*n) //找到了
{
flag=true;
ans=step;
return ;
}
int nn=0;
for(int i=0;i<6;i++)
if(cc[i])
nn++;
if(nn+step>dep) //至少要这么多步
return ;
for(int i=0;i<6;i++)
{
if(i==co)
continue;
for(int j=1;j<=tmp.cnt;j++)
sa[tmp.pp[j].x][tmp.pp[j].y]=i;
dfs(i,step+1,num);
for(int j=1;j<=tmp.cnt;j++) //回溯
sa[tmp.pp[j].x][tmp.pp[j].y]=co;
} }
void IDA()
{
flag=false;
dep=1;
while(!flag) //迭代加深搜索
{
dfs(sa[1][1],0,0);
++dep;
}
} int main()
{
while(scanf("%d",&n)&&n)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&sa[i][j]);
IDA();
printf("%d\n",ans);
}
return 0;
}
ID(dfs+bfs)-hdu-4127-Flood-it!的更多相关文章
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- Leetcode题目104.二叉树的最大深度(DFS+BFS简单)
题目描述: 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,null,null, ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
- HDU 3313 Key Vertex(dfs + bfs)
HDU 3313 Key Vertex 题目链接 题意:一个有向无环图.求s,t之间的割点 思路:先spfa找一条最短路出来,假设不存在.就n个都是割点. 然后每次从s进行dfs,找到能经过最短路上的 ...
- 第三次组队赛 (DFS&BFS)
网站:CSUST 8月1日 先总结下,不得不说死的很惨,又是第三就不说了,一共7道题,AC了5道,但是有一个组三个人是做的个人赛,有两人AK了.......Orz,然后深搜还是大问题,宽搜倒是不急了. ...
- poj 3083 Children of the Candy Corn(DFS+BFS)
做了1天,总是各种错误,很无语 最后还是参考大神的方法 题目:http://poj.org/problem?id=3083 题意:从s到e找分别按照左侧优先和右侧优先的最短路径,和实际的最短路径 DF ...
- 最少步数(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 ...
- POJ 1426 Find The Multiple (DFS / BFS)
题目链接:id=1426">Find The Multiple 解析:直接从前往后搜.设当前数为k用long long保存,则下一个数不是k*10就是k*10+1 AC代码: /* D ...
- Leetcode之深度+广度优先搜索(DFS+BFS)专题-934. 最短的桥(Shortest Bridge)
Leetcode之广度优先搜索(BFS)专题-934. 最短的桥(Shortest Bridge) BFS入门详解:Leetcode之广度优先搜索(BFS)专题-429. N叉树的层序遍历(N-ary ...
随机推荐
- 2014 BDTC 參会有感
中国大数据技术大会(Big Data Technology Conference,BDTC)是眼下国内最具影响.规模最大的大数据领域的技术盛会. 大会的前身是Hadoop中国云计算大会(Hadoop ...
- Ubuntu的防火墙UFW
这是个简单的防火墙,可以直接在命令行启停,也可安装提图形端gufw *安装 sudo apt-get install ufw gufw *常用命令 sudo ufw enable //启动 ufw d ...
- Ubuntu 系统 文件操作命令
文件和目录的操作 用户主目录下有一个 Desktop (对应,桌面)mkdir dir1 建立一个目录cd 不添加参数,默认回到主目录(用户目录)touch a.txt 建立一个文件mv a.txt ...
- [J2EE学习][post,get乱码处理]
post乱码 通过flitter过滤(原理待未来好好学习) <!-- post乱码过虑器 --> <filter> <filter-name>CharacterEn ...
- Request获取url各种信息的方法
1.Request获取url各种信息的方法 测试的url地址:http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPa ...
- oracle导出数据显示出现ora-00109或者LRM-00109出错修改办法
出现这种问题是因为日期格式的问题,调整日期格式后就可以了 改成yyyy-mm-dd的格式就好了
- struts2 标签
一.逻辑控制标签 用于进行逻辑控制输出.主要分以下几类: 1)条件标签:用于执行基本的条件流转 <s:if>:拥有一个test属性,其表达式的值用来决定标签里内容是否显示.<s:if ...
- (原+转)VS2013:正在从以下位置加载符号
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5158020.html 这段时间启动调试时,vs2013加载时间很长很长...然后下面网址给出了解决方法 ...
- sql server中主键列的插入问题
仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'dbo.t_test'中的标识列指定显式值. SET IDENTITY_INSERT dbo.t_test ON ,'c' ...
- project euler 16:Power digit sum
>>> sum([int(i) for i in str(2**1000)]) 1366 >>>