题目链接: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. node 图片上传功能

    node 代码: var http = require("http"); var express = require('express') app = express(), for ...

  2. eclipse xml 编码问题 “3 字节的 UTF-8 序列的字节 3 无效”

    原本项目没问题,git commit之后,突然报错 “3 字节的 UTF-8 序列的字节 3 无效” 尝试过改xml文件编码等,没成功.pom中设置属性,成功解决 <project.build. ...

  3. Centos LVM 创建 删除 扩大 缩小

    新建LVM的过程1.使用fdisk 新建分区 修改ID为8e3.使用 pvcreate 创建 PV 4.使用 vgcreate 创建 VG 5.使用 lvcreate 创建 LV 6.格式化LV7.挂 ...

  4. delphi const的用法

    unit RadKeygen; interface uses Classes,SysUtils,Windows; function fun1():string; implementation cons ...

  5. 【转】Phong和Blinn-Phong光照模型

    来自:http://www.cnblogs.com/bluebean/p/5299358.html Phong和Blinn-Phong是计算镜面反射光的两种光照模型,两者仅仅有很小的不同之处. 1.P ...

  6. Matlab学以致用 - 曲线拟合

    曲线拟合 使用Matlab自带的polyfit函数,可以很方便地根据现有样本数据进行多项式曲线拟合,为了有直观感受,先上例程,如下所示: x = -:; % 样本数据x坐标 y = *x.^ + *x ...

  7. java mysql大数据量批量插入与流式读取分析

    总结下这周帮助客户解决报表生成操作的mysql 驱动的使用上的一些问题,与解决方案.由于生成报表逻辑要从数据库读取大量数据并在内存中加工处理后在 生成大量的汇总数据然后写入到数据库.基本流程是 读取- ...

  8. docker-composer

    1.安装docker-composer   参考官方 安装1.20.1 sudo curl -L https://github.com/docker/compose/releases/download ...

  9. 无插件,无com组件,利用EXCEL、WORD模板做数据导出(一)

    本次随笔主要讲述着工作中是如何解决数据导出的,对于数据导出到excel在日常工作中大家还是比较常用的,那导出到word呢,改如何处理呢,简单的页面导出问题应该不大,但是如果是标准的公文导出呢,要保证其 ...

  10. alter 和 update的用法和区别

    alter的增加和删除alter table xs_kc add xuefen number;alter table xs_kc drop column xuefen; 删除的时候必须使用column ...