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+剪枝,贪心得到的不 ...
随机推荐
- Virus
c:\windows\syswow64\rundll32.exe C:\Users\Administrator.mt1-PC\AppData\Roaming\FishSearch
- mysql 存储过程实例
--存储过程名和参数,参数中in表示传入参数,out标示传出参数,inout表示传入传出参数 create procedure p_procedurecode(in sumdate varchar(1 ...
- MDAC 重新安装
MDAC 重新安装 c:\windows\inf 下找出mdac.inf 然后点右键->安装
- as3 分发事件无法接收
最简单的.直接用舞台接收. 如: stage.addEventListener("ok",okH);
- 10 并发编程-(线程)-GIL全局解释器锁&死锁与递归锁
一.GIL全局解释器锁 1.引子 在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多核优势 首先需要明确的一点是GIL并不是Python的特性,它是在实现Pyt ...
- c++11新特性总结(转)
1.类型与变量相关 1.1.nullptr: 取代了NULL,专用于空指针 1.2.constexpr: 近似const, 可以修饰变量,也可以修饰函数, 修饰变量如: const int globa ...
- Struts和Hibernate使用总结
1 struts.xml重定向时报错 action cannot be found in the namespace/ http://blog.csdn.net/greetturin ...
- CAD2010安装说明
1. 2. 3. 4. 5. . 提供算号服务(也就是付费才能获得的注册码)... 不会的可以问的撒....
- Haskell语言学习笔记(49)ByteString Text
Data.ByteString String 是 [Char] 的同义词,在使用上存在List的惰性所带来的性能问题. 在处理大型二进制文件时,可以使用 ByteString 来代替 String. ...
- Python 3 学习笔记(1)
Python 3.6 运算符 + - * / 四则运算 % 求余 **乘方 // 用于整除 字符串 字符串用单引号或双引号括起来. 三引号(单引号或双引号均可)表示多行字符串,行末加反斜杠表示换行不算 ...