hdu1010深搜+奇偶剪枝
奇偶剪枝:把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深搜+奇偶剪枝相关推荐
- HDU 1010 深搜+奇偶剪枝
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1010 贴个资料: http://acm.hdu.edu.cn/forum/read.php?tid=615 ...
- 斗地主(深搜+贪心+剪枝)
斗地主 题目链接http://www.lydsy.com/JudgeOnline/problem.php?id=4325 solution 由于牌数不是很多,n<=23,一开始想到用状态压缩的方 ...
- 再探深搜之剪枝、迭代加深及双向搜索
一.剪枝 剪枝的基本方法: 1.优化搜索顺序 2.排除等效冗余 3.可行性剪枝(上下界剪枝) 4.最优性剪枝 例题1:AcWing 167.木棒 这题首先很容易想出暴力的代码:从小到大枚举木棍总长度的 ...
- 2412 - 和为K ---深搜dfs剪枝
**2412 - 和为K ---深搜dfs优化 **来源:东方博宜oj oj.czos.cn #include<bits/stdc++.h> using namespace std; co ...
- 搜索 —— 深搜的剪枝技巧
[概述] 搜索算法的时间复杂度大多是指数级的,难以满足对程序运行时间的限制要求,为使降低时间复杂度,对深度优先搜索可以进行一种优化的基本方法--剪枝. 搜索的进程可以看做是从树根出发,遍历一颗倒置树( ...
- Black And White HDU - 5113 深搜dfs+剪枝
原题 Problem Description In mathematics, the four color theorem, or the four color map theorem, states ...
- POJ-1724 深搜剪枝
这道题目如果数据很小的话.我们通过这个dfs就可以完成深搜: void dfs(int s) {if (s==N){minLen=min(minLen,totalLen);return ;}for ( ...
- hdu4876 深搜+(随机枚举剪枝)
题意: 给你n个数,让你从选择k个数,然后排成一个环(k个数的顺序随意,但是排成一个环后就不能变了),然后可以在这个环上任意的找连续w个数(w<=k),可以找多次,得到一个值等于当前 ...
- hdu 3812 Sea Sky 深搜+剪枝
题目意思: 从sea 找一条道sky 的最长路 题解: 先进行一系列的预处理 1.将所有不重复的字符串先保留下来,然后从小到大排序,这样深搜的时候最先弄出来的答案就是最小的 字母序. 2. 进行深度优 ...
最新文章
- 干货|利用卷积自编码器对图片进行降噪
- 使用Leangoo管理Sprint Backlog
- prd模板案例_第三课:产品需求文档——案例分析
- Using string literals in ref attributes is deprecated
- 应该在什么时候使用Hadoop
- redis的五种数据结构
- ttl接地是高电平还是低电平_功放技术参数1——高电平
- centos7光盘修复 grub_centos7修复grub2
- python列表反向_python反向列表
- Facebook 开源:PyTorchVideo!
- django 1.8 官方文档翻译: 14-4-1 重定向应用
- Webpack入门教程三十
- Win7 Server 漏洞修复(CVE-2017-**、CVE-2018-**、CVE-2019-**、CVE-2012-**)
- 考研高数笔记(数一)--pdf文档 百度网盘自取
- android shell强制删除文件夹_Windows 强制删除文件及文件夹命令
- IDEA 使用破解补丁激活
- 软破ps3安装linux,软破PS3安装大于4GB的PKG文件详细教程
- Hazelcast IMDG参考中文版手册-第十一章-分布式查询
- java数组下标异常越界程序,Java程序运行时会自动检查数组的下标是否越界,如果越界,会抛出下面的哪一个异常?...
- 计算机网络技术赚钱,计算机网络技术-.ppt