题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1072

思路:深搜每一个节点,并且进行剪枝,记录每一步上一次的s1,s2;如果之前走过的时间小于这一次,

就说明有更短的;路径,所以就不用继续遍历下去。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[][],step[][],tim[][],m,n,ans;
int zz[][]={{-,},{,},{,},{,-}};
void dfs(int x,int y,int s1,int s2)
{
//cout<<"a=="<<x<<" "<<y<<" "<<a[x][y]<<endl;
if(s1<=||s2>=) return ;
if(x<=||x>n||y<=||y>m) return ;
if(a[x][y]==) return ;
if(a[x][y]==)
{
ans=min(ans,s2);
return ;
}
if(a[x][y]==)
{
s1=;
}
if(step[x][y]<=s2&&tim[x][y]>=s1) return ;
step[x][y]=s2;
tim[x][y]=s1;
for(int i=;i<;i++)
{
int tx=x+zz[i][],ty=y+zz[i][];
dfs(tx,ty,s1-,s2+);
}
}
int main(void)
{
int i,j,t,sx,sy;
scanf("%d",&t);
while(t--)
{
memset(a,,sizeof(a));
scanf("%d %d",&n,&m);
for(i=;i<=n;i++)
for(j=;j<=m;j++)
{
tim[i][j]=;
step[i][j]=;
scanf("%d",&a[i][j]);
if(a[i][j]==) sx=i,sy=j;
}
ans=;
dfs(sx,sy,,);
if(ans==)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
}

用bfs做就要简单一点。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
int ans,e[][],m,n;
int zz[][]={{,},{,-},{,},{-,}};
struct Node{
int x,y;
int step,tim;
};
Node tmp;
void bfs()
{
Node tp;
queue <Node> q;
q.push(tmp);
while(!q.empty())
{
tmp=q.front();
q.pop();
for(int i=;i<;i++)
{
tp.x=tmp.x+zz[i][];
tp.y=tmp.y+zz[i][];
tp.step=tmp.step-;
tp.tim=tmp.tim+;
if(tp.x<=||tp.x>n||tp.y<=||tp.y>m||tp.step<=) continue;
if(e[tp.x][tp.y]==) continue; //cout<<"a="<<tp.x<<" "<<tp.y<<" "<<e[tp.x][tp.y]<<endl;
if(e[tp.x][tp.y]==)
{
ans=tp.tim;
return ;
}
else if(e[tp.x][tp.y]==)
{
q.push(tp);
}
else if(e[tp.x][tp.y]==)
{
tp.step=;
e[tp.x][tp.y]=;
q.push(tp);
}
}
}
}
int main(void)
{
int t,i,j,sx,sy;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
scanf("%d",&e[i][j]);
if(e[i][j]==)
{
tmp.x=i;
tmp.y=j;
tmp.step=;
tmp.tim=;
}
}
}
//memset(vis,0,sizeof(vis));
ans=-;
bfs();
printf("%d\n",ans);
}
return ;
}

hdu - 1072(dfs剪枝或bfs)的更多相关文章

  1. poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)

    Sum It Up Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Sub ...

  2. hdu 4109 dfs+剪枝优化

    求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...

  3. HDU 5113 dfs剪枝

    题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...

  4. Tempter of the Bone HDU 1010(DFS+剪枝)

    Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...

  5. hdu 1518 dfs+剪枝

    题目大意:几根棒子能否组成一个正方形 Sample Input3           //测试组数4 1 1 1 1   //棒子数目以及每根棒子的长度5 10 20 30 40 508 1 7 2 ...

  6. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. HDU 1501 Zipper 【DFS+剪枝】

    HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...

  9. hdu 5887 Herbs Gathering (dfs+剪枝 or 超大01背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5887 题解:这题一看像是背包但是显然背包容量太大了所以可以考虑用dfs+剪枝,贪心得到的不 ...

随机推荐

  1. XML学习记录1-复习SAX,DOM和JAXB

    对xml文档的解析常见的有JDK中的sax,dom,jaxb,stax和JAVA类库JDOM和DOM4J,下面先说说前三个. Java中解析XML的工具很多,像JDOM,DOM4J等,但Java标准库 ...

  2. 关于str.split(",")中间 什么时候该加\\转义

    java 分割符,对于某些符号的分割符进行切割的时候需要加转义字符,我贴上例子 1. package test1; public class split { public static void ma ...

  3. 批量压缩文件.net

    C#调用 ICSharpCode.SharpZipLib.Zip 实现解压缩功能公用类 最近想用个解压缩功能 从网上找了找 加自己修改,个人感觉还是比较好用的,直接上代码如下 using System ...

  4. 判断一个对象是否为真 __nonzero__ 方法和 __len__方法

    class A(): def __nonzero__(self): # 判断 一个对象是否为空,先查看该方法的返回值 return 1 def __len__(self): # 如果没有上一个方法,那 ...

  5. Ubuntu 安装 Elasticsearch

    1.安装java 注意:最新版本的elasticsearch(5.6.2)要求安装java8 1.sudo apt-add-repository ppa:webupd8team/java 2.sudo ...

  6. winform程序开机启动时的运行目录

    并不是程序的当前路径,而是系统的某个目录 如环境是win10 64位,路径是 c:\winfows\SysWOW64\ConfigInfor.json

  7. minikube

    cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://p ...

  8. Electron mouse events 参数解析

    1.https://electronjs.org/docs/api/web-contents 2.通常用: monitorEvents(document.body, 'mouse')  检测正常的值: ...

  9. XtraBackup 备份原理

    来着淘宝技术: http://mysql.taobao.org/monthly/2016/03/07/ https://github.com/alibaba/AliSQL 前言 Percona Xtr ...

  10. Nexus 使用配置

    Nexus使用的一些基本设置 1.更改中央仓库地址为私服地址 既然我们配置了私服,那么相应的,我们的项目就应该使用Nexus的地址(Public Repository)来下载jar包 1.1.基于PO ...