题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

题目大意:

  输入 n m t,生成 n*m 矩阵,矩阵元素由 ‘.’ 'S' 'D' 'X' 四类元素组成.

  S'代表是开始位置; 'D'表示结束位置;'.'表示可以走的路;'X'表示是墙。

  问:从‘S’  能否在第 t 步 正好走到 'D'.

解题思路:

   平常心态做dfs即可,稍微加个奇偶剪枝,第一次做没经验,做过一次下次就知道怎么做了。最后有代码注释解析。

AC Code:

 #include<bits/stdc++.h>
using namespace std;
int n,m,t;
int doorX,doorY;
char ca[][];
int to[][] = {{,-},{,},{-,},{,}};
int dfs(int x,int y,int cnt)
{
if(x>n||y>m||x<=||y<=)return ;
if(cnt==t&&x==doorX&&y==doorY)
return ;
int tem=t-cnt-abs(x-doorX)-abs(y-doorY);
if(tem< || tem& )return ;
for(int i=; i<; i++)
{
if(ca[x+to[i][]][y+to[i][]]!='X')
{
ca[x+to[i][]][y+to[i][]]='X';
if(dfs(x+to[i][],y+to[i][],cnt+))return ;
ca[x+to[i][]][y+to[i][]]='.';
}
}
return ;
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF&&n+m+t)
{
int i,j,wall=,stratX,stratY;
getchar();
for(i=; i<=n; i++)
{
for(j=; j<=m; j++)
{
scanf("%c",&ca[i][j]);
if(ca[i][j]=='S')
stratX=i,stratY=j;
else if(ca[i][j]=='X')
wall++;
else if(ca[i][j]=='D')
doorX=i,doorY=j;
}
getchar();
}
if(n*m-wall<=t)
{
printf("NO\n");
continue;
}
ca[stratX][stratY]='X';
if(dfs(stratX,stratY,))
printf("YES\n");
else
printf("NO\n");
}
return ;
}

代码解析:

 #include<bits/stdc++.h>
using namespace std;
int n,m,t;//n*m 矩阵 和 走的步数 t
int doorX,doorY;//门的位置
char ca[][];//矩阵大小
int to[][] = {{,-},{,},{-,},{,}};
int dfs(int x,int y,int cnt)
{
if(x>n||y>m||x<=||y<=)return ;//位置越界
if(cnt==t&&x==doorX&&y==doorY)//已走步数 == 要走的步数 t,且位置刚好是门的位置,成功找到一条路
return ;
//! { 奇偶性剪枝:
int tem=t-cnt-abs(x-doorX)-abs(y-doorY);
if(tem< || tem& )return ;
// 剩余的步数小于0 || tem 为奇数 都不满足 return 0 即可!} //@{ 遍历八个方向 递归dfs 如果有条件满足 return 1,否则结束 return 0;
for(int i=; i<; i++)
{
if(ca[x+to[i][]][y+to[i][]]!='X')
{
ca[x+to[i][]][y+to[i][]]='X';
if(dfs(x+to[i][],y+to[i][],cnt+))return ;
ca[x+to[i][]][y+to[i][]]='.';
}
}
return ;
// @}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&t)!=EOF&&n+m+t)
{
int i,j,wall=,stratX,stratY;
getchar();
// 001 { 记录开始位置,墙的个数,以及门的位置
for(i=; i<=n; i++)
{
for(j=; j<=m; j++)
{
scanf("%c",&ca[i][j]);
if(ca[i][j]=='S')
stratX=i,stratY=j;
else if(ca[i][j]=='X')
wall++;
else if(ca[i][j]=='D')
doorX=i,doorY=j;
}
getchar();
}
// 001 }
//002 {剪一下枝: 如果墙的个数+走的步数>=矩阵单元的个数,则肯定无法完成此任务,因为还要有开始和门的位置存在
if(n*m-wall<=t)
{
printf("NO\n");
continue;
}
//002 }
ca[stratX][stratY]='X';//003 { 将开始位置置为墙不可再次访问 } if(dfs(stratX,stratY,))
printf("YES\n");
else
printf("NO\n");
}
return ;
}

HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)的更多相关文章

  1. hdu.1010.Tempter of the Bone(dfs+奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  2. hdu - 1010 Tempter of the Bone (dfs+奇偶性剪枝) && hdu-1015 Safecracker(简单搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1010 这题就是问能不能在t时刻走到门口,不能用bfs的原因大概是可能不一定是最短路路径吧. 但是这题要过除了细心 ...

  3. HDU 1010 Tempter of the Bone --- DFS

    HDU 1010 题目大意:给定你起点S,和终点D,X为墙不可走,问你是否能在 T 时刻恰好到达终点D. 参考: 奇偶剪枝 奇偶剪枝简单解释: 在一个只能往X.Y方向走的方格上,从起点到终点的最短步数 ...

  4. HDU 1010 Tempter of the Bone (DFS+可行性奇偶剪枝)

    <题目链接> 题目大意:一个迷宫,给定一个起点和终点,以及一些障碍物,所有的点走过一次后就不能再走(该点会下陷).现在问你,是否能从起点在时间恰好为t的时候走到终点. 解题分析:本题恰好要 ...

  5. hdu 1010 Tempter of the Bone 深搜+剪枝

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  6. Tempter of the Bone(dfs奇偶剪枝)

    Tempter of the Bone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  7. M - Tempter of the Bone(DFS,奇偶剪枝)

    M - Tempter of the Bone Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & % ...

  8. HDU 1010 Tempter of the Bone DFS(奇偶剪枝优化)

    需要剪枝否则会超时,然后就是基本的深搜了 #include<cstdio> #include<stdio.h> #include<cstdlib> #include ...

  9. (step4.3.1) hdu 1010(Tempter of the Bone——DFS)

    题目大意:输入三个整数N,M,T.在接下来的N行.M列会有一系列的字符.其中S表示起点,D表示终点. .表示路 . X表示墙...问狗能有在T秒时到达D.如果能输出YES, 否则输出NO 解题思路:D ...

随机推荐

  1. TCP/UDP,SOCKET网络通信,C++/Java实现

    趁这两天没事干,就把网络通信这一块搞一搞,C/S方面的了解一下,很重要! TCP Server/Client

  2. 访问修饰符(public,private,protected,internal,sealed,abstract)

    为了控件C#中的对象的访问权限,定义对象时可以在前面添加修饰符. 修饰符有五种:private(私有的),protected(受保护的),internal(程序集内部的),public(公开的),以及 ...

  3. 运维mysql基础

    1 mysql简介 一般写某个东西先介绍一下,我就老生常谈的简单介绍下(摘自维基百科) https://zh.wikipedia.org/wiki/MySQL MySQL(官方发音为英语发音:/maɪ ...

  4. 【POJ 2528】Mayor’s posters(线段树+离散化)

    题目 给定每张海报的覆盖区间,按顺序覆盖后,最后有几张海报没有被其他海报完全覆盖.离散化处理完区间端点,排序后再给相差大于1的相邻端点之间再加一个点,再排序.线段树,tree[i]表示节点i对应区间是 ...

  5. 网络爬虫2--PHP/CURL库(client URL Request Library)

    PHP/CURL库功能   多种传输协议.CURL(client URL Request Library),含义是“客户端URL请求库”. 不像上一篇所用的PHP内置网络函数,PHP/CURL支持多种 ...

  6. Hadoop 学习笔记3 Develping MapReduce

    小笔记: Mavon是一种项目管理工具,通过xml配置来设置项目信息. Mavon POM(project of model). Steps: 1. set up and configure the ...

  7. linux永久更改eth0的ip地址后仍然ping不通过

    编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 引用:DEVICE=eth0 //设备名称,不要修改 BOOTPROTO=static //不要修改 BRO ...

  8. jquery插件-表单验证插件-rules

    ruels方法 1说明:查看.新增.移除一个表单控件的验证规则 2使用: 表单控件.rules(); 参数: rules() 返回元素的验证规则 rules('add',rules) 增加验证规则 r ...

  9. Linq Like

    Like的操作,有点像in,但是,方向变了.什么意思呢.就是你给定一个字符串,去寻找数据中某个字段包含这个字符串.就是给定的字符串是某字段的子集.Sql Script是这么写的. Selec * fr ...

  10. C/C++ Lua Parsing Engine

    catalog . Lua语言简介 . 使用 Lua 编写可嵌入式脚本 . VS2010编译Lua . 嵌入和扩展: C/C++中执行Lua脚本 . 将C++函数导出到Lua引擎中: 在Lua脚本中执 ...