hdu - 1072(dfs剪枝或bfs)
题目链接: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)的更多相关文章
- 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 ...
- hdu 4109 dfs+剪枝优化
求最久时间即在无环有向图里求最远路径 dfs+剪枝优化 从0节点(自己添加的)出发,0到1~n个节点之间的距离为1.mt[i]表示从0点到第i个节点眼下所得的最长路径 #include<iost ...
- HDU 5113 dfs剪枝
题意:告诉格子规格,颜色个数,以及每个颜色能涂得格子数目,问是否能够实现相邻两个格子的颜色数目不相同. 分析:因为数据很小,格子最多是5 * 5大小的,因此可以dfs.TLE了一次之后开始剪枝,31m ...
- Tempter of the Bone HDU 1010(DFS+剪枝)
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- hdu 1518 dfs+剪枝
题目大意:几根棒子能否组成一个正方形 Sample Input3 //测试组数4 1 1 1 1 //棒子数目以及每根棒子的长度5 10 20 30 40 508 1 7 2 ...
- HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)
Counting Cliques Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))
Equation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 1501 Zipper 【DFS+剪枝】
HDU 1501 Zipper [DFS+剪枝] Problem Description Given three strings, you are to determine whether the t ...
- hdu 5887 Herbs Gathering (dfs+剪枝 or 超大01背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5887 题解:这题一看像是背包但是显然背包容量太大了所以可以考虑用dfs+剪枝,贪心得到的不 ...
随机推荐
- linux时间
1.查看时间:date Thu Mar 2 13:22:54 UTC 2017 2.查看时区:date -R Thu, 02 Mar 2017 13:23:32 +0000 3.Linux时间戳:d ...
- as3 区别中文 英文 数字
1)英文a-z是65-90,A-Z是97-112 2)数字是0-9是,48-57 3)上万的都是中文字符 var str:String = "hello world! 你好世界! 88!&q ...
- apiCloud事件发送与监听
apiCloud事件发送与监听 1.sendEvent 将任意一个自定义事件广播出去,该事件可在任意页面通过 addEventListener 监听收到. sendEvent({params}) 2. ...
- ArrayList 原理(1)
ArrayList是Java List类型的集合类中最常使用的,本文基于Java1.8,对于ArrayList的实现原理做一下详细讲解. (Java1.8源码:http://docs.oracle.c ...
- SQL语言类别
SQL语言主要分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL. DQL (data query language) DML(data manipulati ...
- Linux 的伪终端的基本原理 及其在远程登录(SSH,telnet等)中的应用
本文介绍了linux中伪终端的创建,介绍了终端的回显.行缓存.控制字符等特性,并在此基础上解释和模拟了telnet.SSH开启远程会话的过程. 一.轻量级远程登录 之前制作的一块嵌入式板子,安装了嵌入 ...
- NISP视频知识点总结
身份认证访问控制安全审计本章实验 ===密码学=====古典密码 算法本身的保密性近代密码 机械密码\机电 密码打字密码机轮转机现代密码 基于密钥公钥密码 公钥==================对称 ...
- STS或eclipse安装SVN插件
安装sts--SVN插件 简介:sts是与eclipse类似的Java IDE开发工具(不了解的百度) 1.sts菜单栏 help->install New Software 依据大家的版本选择 ...
- 出现了npm ERR! cb() never called!错误
执行npm i 命令时,出现了npm ERR! cb() never called!错误 解决方案: 1.首先清除你的npm缓存: sudo npm cache clean -f 一般情况执行完后再试 ...
- string类小结
要想使用标准C++中string类,必须要包含 #include <string>// 注意是<string>,不是<string.h>,带.h的是C语言中的头文件 ...