http://acm.hdu.edu.cn/showproblem.php?pid=1010

题意很好理解,不是最短路,而是dfs,虽然地图不算大,稍微注意一点的dfs也能险过,但是700+ms和78ms一对比还是让人难受

对dfs的剪枝处理,实际上就是一个逻辑推理

面对整个地图我可以做出以下判断如果 n * m - wall <= t那就一定say NO

n * m 是整个地图的大小,wall是地图中墙的个数相减之后就是最多可以走的步数,之所以取到等号是因为在第0秒的时候,已经走了一个地方了(起点)

这就是路径剪枝
接下来看一看奇偶剪枝:

奇偶剪枝:
把矩阵标记成如下形式
0,1,0,1,0
1,0,1,0,1
0,1,0,1,0
1,0,1,0,1

起点和终点奇偶不同——要走奇数步,奇偶相同——要走偶数步,与路径剪纸不同的是奇偶剪纸可以放到dfs里,对dfs的优化效果也很好

进而可以推出下面的关系(他们之间的关系有一个就是奇数-奇数=偶数,偶数-偶数=偶数,所以如果temp是奇数,那么就say no)

 令 temp = (t - step) - (abs(sx - ex) + abs(sy - ey));
    abs(sx - ex) + abs(sy - ey)到达终点最少还要的步数
    t - step 还剩下的步数
    1——》temp < 0 肯定到不了了return
    2——》temp > 0 
    (1)temp是奇数 --》绕道多走必然多走偶数步-出去一步,进来以不,
    //例如走a b你可以试一试无论怎么走再回到正轨上肯定多走偶数步所以retur
    (2)temp是偶数--》可以正常dfs

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
using namespace std;
const int maxn = 10;
int mp[10][10];
int vis[10][10];
int foot[4][2] = {1,0,-1,0,0,1,0,-1};
int n,m,t,sx,sy,ex,ey,wall;
int retflag;
void init()
{
memset(mp,0,sizeof(mp));
memset(vis,0,sizeof(vis));
retflag = 0;
wall = 0;
}
void dfs(int x,int y,int step)
{
if(x == ex && y == ey)
{
if(step == t)
{
retflag = 1;
}
return;
}
if(retflag)return;
int temp = (t - step) - (abs(sx - ex) + abs(sy - ey));
if(temp < 0 || temp & 1)
{
return;
}
for(int i = 0;i < 4;i++)
{
int nx = x + foot[i][0];
int ny = y + foot[i][1];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && !vis[nx][ny] && mp[nx][ny] != 1)
{
vis[nx][ny] = 1;
dfs(nx,ny,step + 1);
vis[nx][ny] = 0;
}
}
} int main()
{
char ch;
while(~scanf("%d%d%d",&n,&m,&t))
{
getchar();
if(!n && !m && !t)break;
init();
for(int i = 0;i < n;i++)
{
for(int j = 0;j < m;j++)
{
scanf("%c",&ch);
if(ch=='X'){mp[i][j] = 1;wall++;}
if(ch=='S')
{
sx = i;
sy = j;
vis[i][j] = 1;
}
if(ch=='D')
{
ex = i;
ey = j;
}
if(ch=='.')mp[i][j] = 0;
}
getchar();
}
if(n * m - wall <= t)
{
printf("NO\n");
continue;
}
dfs(sx,sy,0);
if(retflag)printf("YES\n");
else printf("NO\n");
}
return 0;
}

DFS剪枝处理HDU1010的更多相关文章

  1. *HDU1455 DFS剪枝

    Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  2. POJ 3009 DFS+剪枝

    POJ3009 DFS+剪枝 原题: Curling 2.0 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16280 Acce ...

  3. poj 1724:ROADS(DFS + 剪枝)

    ROADS Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 10777   Accepted: 3961 Descriptio ...

  4. DFS(剪枝) POJ 1011 Sticks

    题目传送门 /* 题意:若干小木棍,是由多条相同长度的长木棍分割而成,问最小的原来长木棍的长度: DFS剪枝:剪枝搜索的好题!TLE好几次,终于剪枝完全! 剪枝主要在4和5:4 相同长度的木棍不再搜索 ...

  5. DFS+剪枝 HDOJ 5323 Solve this interesting problem

    题目传送门 /* 题意:告诉一个区间[L,R],问根节点的n是多少 DFS+剪枝:父亲节点有四种情况:[l, r + len],[l, r + len - 1],[l - len, r],[l - l ...

  6. HDU 5952 Counting Cliques 【DFS+剪枝】 (2016ACM/ICPC亚洲区沈阳站)

    Counting Cliques Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  7. HDU 5937 Equation 【DFS+剪枝】 (2016年中国大学生程序设计竞赛(杭州))

    Equation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  8. LA 6476 Outpost Navigation (DFS+剪枝)

    题目链接 Solution DFS+剪枝 对于一个走过点k,如果有必要再走一次,那么一定是走过k后在k点的最大弹药数增加了.否则一定没有必要再走. 记录经过每个点的最大弹药数,对dfs进行剪枝. #i ...

  9. poj 1011 Sticks (DFS+剪枝)

    Sticks Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 127771   Accepted: 29926 Descrip ...

随机推荐

  1. 吴裕雄 python神经网络 水果图片识别(2)

    import osimport numpy as npimport matplotlib.pyplot as pltfrom skimage import color,data,transform,i ...

  2. 兼容谷歌、火狐、IE7.0以上浏览器div+css实现的带有蒙版的半透明弹窗效果[xyytit]

    整个页面变暗的蒙版效果,带有半透明边框的弹窗,用在网站里一定很酷. 最初见与奢饰品购物网站YMALL,后边研究了下,自己做了这个实例. 技术要点:css中几种透明样式的使用.不同的样式在不同的浏览器中 ...

  3. 【校招面试 之 剑指offer】第11题 旋转数组中的最小数字

    题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如: 数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转, ...

  4. MongoDB安装(一)

    详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win32-x86_64-2008plus-ssl-3.4.1-signed. 示例版本:mongodb-wi ...

  5. Volley下载图片存放在data/data下 networkImageView lrucache

    networkImageView 设置图片的方法  (有效) imageView.setImageUrl("https://www.baidu.com/img/bd_logo1.png&qu ...

  6. win2003上传文件限制

    Windows2003系统下,上传较大的文件时,会出现“Request 对象 错误 'ASP 0104 : 80004005'”错误或者出现空白页面的时候,此时,不要轻易的去找程序的问题,有可能是wi ...

  7. 【转】VS2012 中文版转英文版 英文版转中文版 界面语言切换

    [1]下载VS2012的语言包,各种语言包都有,下载对应的即可. 微软官网衔接地址:vs2012 语言包  http://www.microsoft.com/zh-CN/download/detail ...

  8. linux-centos6-rabbitmq安装及配置

    服务器版本centos6.8 一.先安装Erlang 具体安装哪个版本可以对照 http://www.rabbitmq.com/which-erlang.html 如下图: 准备安装RabbitMQ3 ...

  9. 设置powershell ExecutionPolicy

    Get-ExecutionPolicy -List Set-ExecutionPolicy -Scope CurrentUser AllSigned Policies: Restricted/AllS ...

  10. ejb 和pojo , jboss 和 tomcat

    EJB(企业JavaBeans)是普通JavaBeans的一种提升和规范,因为企业信息系统开发中需要一个可伸缩的性能和事务.安全机制,这样能保证企业系统平滑发展,而不是发展到一种规模重新更换一套软件系 ...