奇偶剪枝:把map看作
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
1 0 1 0 1 0
0 1 0 1 0 1
 
从 0->1 需要奇数步
从 1->0 需要偶数步
那么设所在位置 (si,sj) 与 目标位置 (di,dj)
如果abs(si-sj)+abs(di-dj)为偶数,则说明 abs(si-sj) 和 abs(di-dj)的奇偶性相同,需要走偶数步
如果abs(si-sj)+abs(di-dj)为奇数,那么说明 abs(si-sj) 和 abs(di-dj)的奇偶性不同,需要走奇数步
理解为 abs(si-sj)+abs(di-dj) 的奇偶性就确定了所需要的步数的奇偶性!!
而 (t-cnt)表示剩下还需要走的步数,由于题目要求要在 t时 恰好到达,那么  (t-cnt) 与 abs(si-sj)+abs(di-dj) 的奇偶性必须相同
因此 temp=t-cnt-abs(sj-dj)-abs(si-di) 必然为偶数!
 
其实很简单,就是从一个点到另一个点总会有最短路径abs(sj-dj)-abs(si-di),如果你要迂回走,总要走多偶数步才能到达。

#include<stdio.h>
#include<math.h>
#include<string.h>
char s[15][15];
int check[15][15];
int n,m,t;
int endi,endj;
int dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};int dfs(int si,int sj,int sum)
{int i,j,k,ch;if(si==endi&&sj==endj&&sum==t)return 1;k=t-sum-fabs(si-endi)-fabs(sj-endj);if(k<0||k%2==1)return 0;if(si<0||sj<0||si>=n||sj>=m)return 0;for(i=0;i<4;i++){if(s[si+dir[i][0]][sj+dir[i][1]]=='.'&&check[si+dir[i][0]][sj+dir[i][1]]!=1){check[si+dir[i][0]][sj+dir[i][1]]=1;ch=dfs(si+dir[i][0],sj+dir[i][1],sum+1);if(ch==1)return 1;check[si+dir[i][0]][sj+dir[i][1]]=0;}}return 0;
}int main()
{int i,j,k,d,count,si,sj;while(scanf("%d%d%d",&n,&m,&t)>0,n,m,t){if(n==0&&m==0&&t==0) break;getchar();count=0;memset(check,0,sizeof(check));for(i=0;i<n;i++){scanf("%s",s[i]);getchar();}for(i=0;i<n;i++)for(j=0;j<m;j++){if(s[i][j]=='S'){si=i;sj=j;}if(s[i][j]=='D'){endi=i;endj=j;s[i][j]='.';}if(s[i][j]=='X'){count++;check[i][j]=1;}}check[si][sj]=1;if(n*m-count<=t)printf("NO\n");elseif(dfs(si,sj,0)==1)printf("YES\n");elseprintf("NO\n");}return 0;
}

转载于:https://www.cnblogs.com/wanru/archive/2013/04/14/3020485.html

hdu1010深搜+奇偶剪枝相关推荐

  1. HDU 1010 深搜+奇偶剪枝

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010 贴个资料: http://acm.hdu.edu.cn/forum/read.php?tid=615 ...

  2. 斗地主(深搜+贪心+剪枝)

    斗地主 题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=4325 solution 由于牌数不是很多,n<=23,一开始想到用状态压缩的方 ...

  3. 再探深搜之剪枝、迭代加深及双向搜索

    一.剪枝 剪枝的基本方法: 1.优化搜索顺序 2.排除等效冗余 3.可行性剪枝(上下界剪枝) 4.最优性剪枝 例题1:AcWing 167.木棒 这题首先很容易想出暴力的代码:从小到大枚举木棍总长度的 ...

  4. 2412 - 和为K ---深搜dfs剪枝

    **2412 - 和为K ---深搜dfs优化 **来源:东方博宜oj oj.czos.cn #include<bits/stdc++.h> using namespace std; co ...

  5. 搜索 —— 深搜的剪枝技巧

    [概述] 搜索算法的时间复杂度大多是指数级的,难以满足对程序运行时间的限制要求,为使降低时间复杂度,对深度优先搜索可以进行一种优化的基本方法--剪枝. 搜索的进程可以看做是从树根出发,遍历一颗倒置树( ...

  6. Black And White HDU - 5113 深搜dfs+剪枝

    原题 Problem Description In mathematics, the four color theorem, or the four color map theorem, states ...

  7. POJ-1724 深搜剪枝

    这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) {if (s==N){minLen=min(minLen,totalLen);return ;}for ( ...

  8. hdu4876 深搜+(随机枚举剪枝)

    题意:       给你n个数,让你从选择k个数,然后排成一个环(k个数的顺序随意,但是排成一个环后就不能变了),然后可以在这个环上任意的找连续w个数(w<=k),可以找多次,得到一个值等于当前 ...

  9. hdu 3812 Sea Sky 深搜+剪枝

    题目意思: 从sea 找一条道sky 的最长路 题解: 先进行一系列的预处理 1.将所有不重复的字符串先保留下来,然后从小到大排序,这样深搜的时候最先弄出来的答案就是最小的 字母序. 2. 进行深度优 ...

最新文章

  1. 干货|利用卷积自编码器对图片进行降噪
  2. 使用Leangoo管理Sprint Backlog
  3. prd模板案例_第三课:产品需求文档——案例分析
  4. Using string literals in ref attributes is deprecated
  5. 应该在什么时候使用Hadoop
  6. redis的五种数据结构
  7. ttl接地是高电平还是低电平_功放技术参数1——高电平
  8. centos7光盘修复 grub_centos7修复grub2
  9. python列表反向_python反向列表
  10. Facebook 开源:PyTorchVideo!
  11. django 1.8 官方文档翻译: 14-4-1 重定向应用
  12. Webpack入门教程三十
  13. Win7 Server 漏洞修复(CVE-2017-**、CVE-2018-**、CVE-2019-**、CVE-2012-**)
  14. 考研高数笔记(数一)--pdf文档 百度网盘自取
  15. android shell强制删除文件夹_Windows 强制删除文件及文件夹命令
  16. IDEA 使用破解补丁激活
  17. 软破ps3安装linux,软破PS3安装大于4GB的PKG文件详细教程
  18. Hazelcast IMDG参考中文版手册-第十一章-分布式查询
  19. java数组下标异常越界程序,Java程序运行时会自动检查数组的下标是否越界,如果越界,会抛出下面的哪一个异常?...
  20. 计算机网络技术赚钱,计算机网络技术-.ppt

热门文章

  1. 从内核文件系统看文件读写过程
  2. 记录之关于tensoflow中使用Adam优化算法导致模型保存时参数的变化的记录
  3. vector插入/删除元素
  4. Oracle数据库如何查看当前用户角色权限及默认表空间
  5. C++中常量成员函数的含义
  6. # # # 正则
  7. Identityserver4中ResourceOwnerPassword 模式获取refreshtoken
  8. fastjson的@JSONField注解
  9. mybatis多排序问题
  10. Android根据URL下载文件保存到SD卡