题目链接: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. centos 7 下进入单用户模式修改root密码

    centos7进入单用户模式修改root用户密码 在工作中可能会遇到root密码忘记,那么这里就要进入单用户模式下了. 在重启电脑之后 时间:2015-05-13 10:42来源:blog.51cto ...

  2. jQ1.5源码注释以及解读RE

    jQ作为javascript的库( ▼-▼ ), 尽善尽美, 代码优美,  值得学习.  这一周平常上班没啥事也看jQ1.5的代码, 今天周六差不多看完了(Sizzle部分还没看), 重新看了一下, ...

  3. css-控制元素中的字符超过规定的宽度影藏

    代码如下: <div style="width:100px; white-space:nowrap;overflow:hidden;text-overflow:ellipsis; bo ...

  4. Java中Comparable和Comparator区别小结

    一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...

  5. BZOJ 1115: [POI2009]石子游戏Kam

    1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 883  Solved: 545[Submit][Stat ...

  6. js-this的用法,来自阮一峰老师的文章

    1. 随着函数使用场合的不同,this的值会发生变化.但是有一个总的原则,那就是this指的是,调用函数的那个对象. 或者说,this指向当前执行的函数的所有者. 2.情况一:纯粹的函数调用 这是函数 ...

  7. Angular实现注册系统

    Angular是Google开发的前端技术框架,下载地址:https://code.angularjs.org/1.5.0/angular.js 通过对angular的简单理解后发现,angular通 ...

  8. 【BZOJ-1367】sequence 可并堆+中位数

    1367: [Baltic2004]sequence Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 932  Solved: 348[Submit][S ...

  9. 【poj2114】 Boatherds

    http://poj.org/problem?id=2114 (题目链接) 题意 给出一棵树,问是否存在两点间的距离为K. Solution 点分治嘛,跟poj1741差不多.. 然而为什么我调了一个 ...

  10. Jenkins与Hudson的关系

    Jenkins的前身是Hudson(Sun开发),2010年从Hudson分支出来. 由于Sun被Oracle收购,Oracle拥有Hudson的商标所有权.分支出来的Jenkins将继续走open ...