`
lgh1992314
  • 浏览: 315576 次
文章分类
社区版块
存档分类
最新评论

HDU 1010 经典深搜+奇偶剪枝

 
阅读更多

刚学搜索,不知道剪枝的重要性。

超时代码:

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
char maps[10][10];
const int moves[4][2] = {{0,-1},{0,1},{1,0},{-1,0}};

int m,n,t,di,dj;
bool escape;

void DFS(int si,int sj,int cnt)
{
	if(si>n||si<=0||sj>m||sj<=0) return;
	if(cnt==t&&si==di&&sj==dj)
	{
		escape = 1;
		return;	
	} 
	for(int i=0;i<4;i++)
	{
		if(maps[si+moves[i][0]][sj+moves[i][1]]!='X')
		{
			maps[si+moves[i][0]][sj+moves[i][1]] = 'X';
			DFS(si+moves[i][0],sj+moves[i][1],cnt+1);
			maps[si+moves[i][0]][sj+moves[i][1]] = '.';
		}
	}
	return;
}

int main()
{
	freopen("E:\\ACM\\HDOJ\\hdoj_1010\\in.txt","r",stdin);
	int si,sj;
	while(cin>>n>>m>>t)
	{
		if(n==0&&m==0&&t==0) break;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=m;j++)
			{
				cin>>maps[i][j];
				if(maps[i][j]=='S')
				{
					si = i;
					sj = j;
				}
				else if(maps[i][j]=='D')
				{
					di = i;
					dj = j;
				}
			}
		}

		escape = 0;
		maps[si][sj] = 'X';
		DFS(si,sj,0);
		if(escape) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}



网上搜下,是奇偶性剪枝:

  1. //Tempter of the Bone
  2. /**//*//////////////////////////////////////////////////////////////////////////
  3. 奇偶剪枝:把map看作
  4. 0 1 0 1 0 1
  5. 1 0 1 0 1 0
  6. 0 1 0 1 0 1
  7. 1 0 1 0 1 0
  8. 0 1 0 1 0 1
  9. 从 0->1 需要奇数步
  10. 从 1->0 需要偶数步
  11. 那么设所在位置 (si,sj) 与 目标位置 (di,dj)
  12. 如果abs(si-sj)+abs(di-dj)为偶数,则说明 abs(si-sj) 和 abs(di-dj)的奇偶性相同,需要走偶数步
  13. 如果abs(si-sj)+abs(di-dj)为奇数,那么说明 abs(si-sj) 和 abs(di-dj)的奇偶性不同,需要走奇数步
  14. 理解为 abs(si-sj)+abs(di-dj) 的奇偶性就确定了所需要的步数的奇偶性!!
  15. 而 (t-cnt)表示剩下还需要走的步数,由于题目要求要在 t时 恰好到达,那么 (t-cnt) 与 abs(si-sj)+abs(di-dj) 的奇偶性必须相同
  16. 因此 temp=t-cnt-abs(sj-dj)-abs(si-di) 必然为偶数!


/*奇偶剪枝的重要思想是:如果从当前位置还需要偶数(奇数)的时间才能到达目标位置,而当前剩余的时间数

为奇数(偶数),那么即刻退出不再沿着纵深方向继续搜索。略微思考便知:奇偶剪枝的效果是立竿见影的!

*/

1、temp = (t-cnt) - abs(si-di) - abs(sj-dj);

if(temp<0||temp&1) return;

2、可移动的步数大于给定的时间

起到了立竿见影的效果!

分享到:
评论

相关推荐

    ACM hdu 线段树题目+源代码

    ACM hdu 线段树题目+源代码 线段树是一种非常重要的数据结构,它广泛应用于算法竞赛和实际编程中。今天,我们将通过 ACM hdu 的几个题目来学习和掌握线段树的基本概念和应用。 线段树的基本概念 线段树是一种...

    HDU 1010-2500解题报告

    这个压缩包文件包含的是从HDU题目ID1010到2500之间的部分解题报告,对于想要提升编程能力、学习算法知识的ACMer来说,是一份宝贵的资源。 这些解题报告通常会包含以下几个方面的重要知识点: 1. **题目描述**:每...

    hdu1010搜索算法

    杭州电子科技大学oj平台上的第1010题,是关于搜索的题目,很不错的题

    hdu 1753 大明A+B

    Problem Description 话说,经过了漫长的一个多月,小明已经成长了许多,所以他改了一个名字叫“大明”。 这时他已经不是那个只会做100以内加法的那个“小明”了,现在他甚至会任意长度的正小数的加法。...

    ACM.rar_ACM 绠楁硶_HDU1010_hdu 18

    本报告围绕“ACM.rar”这个压缩包,我们将深入探讨其中涉及到的三道题目——HDU1010、ZOJ1010和ZOJ1015,并分享一些原创解题思路,尽管这些算法可能并非最优,但它们为我们提供了一种独特的视角来理解和解决问题。...

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    acm入门之枚举搜索

    acm入门之枚举搜索,学校第一次acm培训,包括枚举及其优化,dfs和bfs

    HDU+2000-2099+解题报告

    HDU(杭州电子科技大学)在线评测系统是许多编程竞赛爱好者和学习者经常访问的平台,它提供了大量的算法题目供用户练习和挑战。这个压缩包文件“HDU 2000-2099 解题报告”显然包含了在这个题号范围内的一些问题、...

    HDU+2000-2099+解题报告.zip

    4. **排序与搜索**:快速排序、归并排序、二分查找等经典算法在HDU题目中经常出现。解题报告会深入讲解这些算法的原理和应用场景,并给出高效的实现代码。 5. **字符串处理**:包括KMP算法、Manacher's Algorithm等...

    HDUc++上机测试真题(错题汇集1

    在C++编程语言中,`new`和`delete`是两个关键的操作符,它们与C语言中的`malloc`和`free`有所不同。`new`不仅分配内存,还会根据指定的类型调用对应的构造函数来初始化对象,而`malloc`仅仅分配内存,不涉及对象的...

    hdu 3341(ac自动机+状态压缩)

    hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...

    hdu 300+ AC 代码

    HDU 300+ AC 代码集合是一个包含超过300个已通过验证的算法解决方案的资源,这些代码主要用于解决各类计算机编程竞赛中的问题。这些竞赛通常由杭州电子科技大学(HDU)主办,旨在提升参赛者的算法设计、编程和问题...

    ACM HDU题目分类

    搜索题是 ACM HDU 题目分类中的一大类,例如,1010 搜索题,剪枝很关键;1016 经典的搜索;1026 搜索;1043 经典搜索题,八数码问题;1044 稍微有点麻烦的搜索题;1045 搜索题,可用匹配做 等等。 贪心算法 贪心...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    hdu 1695 GCD(欧拉函数+容斥原理).docx

    "hdu 1695 GCD(欧拉函数+容斥原理)" 题目大意是:给定 a, b, c, d, k,找到一队 x, y,满足 g(x, y) = k,且 x ∈ [1, b], y ∈ [1, d],问有多少对符合要求的 (x, y)。 思路是:gcd(x, y) == k 解释 x, y 都能...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    hdu1250高精度加法

    ### hdu1250高精度加法 #### 背景介绍 在计算机科学与编程竞赛中,处理大整数运算(特别是加法、减法、乘法等)是常见的需求之一。当数字的位数超过了标准数据类型(如`int`、`long`等)所能表示的最大值时,就需要...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    hdu+acm课件

    最后,"HDU+ACM课件"可能是一个综合性的课件集合,涵盖了ACM竞赛的各种主题,包括数据结构、算法、问题解决策略等。这是一份全面的学习资料,对于系统性地学习ACM知识非常有价值。 通过学习这些文件,你可以深入...

Global site tag (gtag.js) - Google Analytics