这道题困扰我的不是算法问题。而是细节问题。不优化一直搜到底 时间是690ms左右

没有优化的dfs

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. char map[][];
  5. int flag[][];
  6. int way[][]={ ,,,-,,,-, };
  7. typedef struct
  8. {
  9. int x,y;
  10. } point;
  11. point sta;
  12. int n,m;
  13. int t;
  14. int dfs( int s,int x,int y )
  15. {
  16. int i,xx,yy;
  17. if( map[x][y]=='D' && s==t ) return true; /*c++,true c用1*/
  18. if( map[x][y]=='D' && s!=t ) return false;
  19. if( s>=t ) return false;
  20. for( i=;i<;i++ )
  21. {
  22. xx=x+way[i][] , yy=y+way[i][];
  23. if( xx>= && xx<n && yy>= && yy<m && map[xx][yy]!='X' && !flag[xx][yy] )
  24. {
  25. flag[xx][yy]=;
  26. if( dfs(s+,xx,yy) )
  27. return true;
  28. flag[xx][yy]=;
  29. }
  30. }
  31. return false;
  32. }
  33.  
  34. int main()
  35. {
  36. int i,j;
  37. while(scanf("%d%d%d",&n,&m,&t)&&(n||m||t))
  38. {
  39. memset( flag,,sizeof(flag) );
  40. for( i=;i<n;i++ )
  41. {
  42. scanf("%s",map[i]);//在这里是关键地方,我就是死在这里了,c里面先用getchar()消去回车。然后getchar()一个个接收。但是不幸的是wa了!!这里最好用 %s可以消去回车,用这个可以ac。c++里用cin>>同样不用考虑这个问题
  43. for( j=;j<m;j++ )
  44. {
  45. if( map[i][j]=='S' )
  46. {
  47. sta.x=i ;
  48. sta.y=j ;
  49. }
  50. }
  51. }
  52. flag[sta.x][sta.y]=;
  53. if( dfs( ,sta.x,sta.y ) )
  54. printf( "YES\n" );
  55. else printf( "NO\n" );
  56. }
  57. return ;
  58. }

优化后的算法时间是260ms

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. char map[][];
  5. int flag[][];
  6. int way[][]={ ,,,-,,,-, };
  7. int n,m;
  8. int t,d,ex,ey,sx,sy;
  9. int dfs( int s,int x,int y )
  10. {
  11. int i,xx,yy;
  12. if( map[x][y]=='D' && s==t ) return ;
  13. if( map[x][y]=='D' && s!=t ) return ;
  14. if( s>=t ) return ;
  15.  
  16. d = abs(x-ex) + abs(y-ey); /*如果预计正常没有墙壁阻隔,那么最短能走多少步*/
  17. if( d + s > t) /*当步数大于要求的步数就返回*/
  18. return ;
  19.  
  20. if( d % != (t-s) % ) /*因为想要到达目的地,如果中间有阻碍想要跳过再回到最短的线路上就要多走2步 */
  21. return ; /*所以能到达目的地的步数量一定是d+n*2 所以这个Time一定是和d同奇偶的
  22. 而判断下个点有没有偏移正确方向就看到这个点开始能否走到目的地 判断是否能走到
  23. 就是看(Time-t)规定步数剩下的步数是否可以到达 就是问这个和d是否同奇偶*/
  24.  
  25. for( i=;i<;i++ )
  26. {
  27. xx=x+way[i][] , yy=y+way[i][];
  28. if( xx>= && xx<n && yy>= && yy<m && map[xx][yy]!='X' && !flag[xx][yy] )
  29. {
  30. flag[xx][yy]=;
  31. if( dfs(s+,xx,yy) )
  32. return ;
  33. flag[xx][yy]=;
  34. }
  35. }
  36. return ;
  37. }
  38.  
  39. int main()
  40. {
  41. int i,j;
  42. while(scanf("%d%d%d",&n,&m,&t)&&(n||m||t))
  43. {
  44. memset( flag,,sizeof(flag) );
  45. for( i=;i<n;i++ )
  46. {
  47. scanf("%s",map[i]);/*最关键的地方*/
  48. for( j=;j<m;j++ )
  49. {
  50. if( map[i][j]=='S' )
  51. {
  52. sx=i ;
  53. sy=j ;
  54. }
  55. else if(map[i][j]=='D')
  56. {
  57. ex=i;
  58. ey=j;
  59. }
  60. }
  61. }
  62. flag[sx][sy]=;
  63. if( dfs( ,sx,sy ) )
  64. printf( "YES\n" );
  65. else printf( "NO\n" );
  66. }
  67. return ;
  68. }

zoj 2110的更多相关文章

  1. DFS Zoj 2110

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2110 //2110 #include<stdio.h> #in ...

  2. HDU 1010 Tempter of the Bone (ZOJ 2110) DFS+剪枝

    传送门: HDU:http://acm.hdu.edu.cn/showproblem.php?pid=1010 ZOJ:http://acm.zju.edu.cn/onlinejudge/showPr ...

  3. ZOJ 2110 Tempter of the Bone

    Tempter of the Bone Time Limit: 2 Seconds      Memory Limit: 65536 KB The doggie found a bone in an ...

  4. ZOJ 2110 Tempter of the Bone(DFS)

    点我看题目 题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO. 思路 :DFS一下就可以,不过要注意下一终止条 ...

  5. ZOJ 2110 Tempter of the Bone(条件迷宫DFS,HDU1010)

    题意  一仅仅狗要逃离迷宫  能够往上下左右4个方向走  每走一步耗时1s  每一个格子仅仅能走一次且迷宫的门仅仅在t时刻打开一次  问狗是否有可能逃离这个迷宫 直接DFS  直道找到满足条件的路径 ...

  6. ZOJ 2110 DFS

    狗要出门,且正好在T秒 就是DFS + 剪枝, 联系一下剪枝技巧 #include<iostream> #include<cstdio> #include<cstring ...

  7. ZOJ 2110 C - Tempter of the Bone

    https://vjudge.net/contest/67836#problem/C The doggie found a bone in an ancient maze, which fascina ...

  8. zoj 2110 Tempter of the Bone (dfs)

    Tempter of the Bone Time Limit: 2 Seconds      Memory Limit: 65536 KB The doggie found a bone in an ...

  9. zoj 2110 很好的dfs+奇偶剪枝

    //我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> ...

随机推荐

  1. Oracle Spatial-元数据及SDO_GEOMETRY

    一.空间表的元数据 将表的SDO_GEOMETRY列的所有对象作为一个空间层.Spatial需要对所有空间对象进行验证.创建索引和查询.此时需要为图层指定适当的元数据,该数据包含如下信息:维度.维度边 ...

  2. Handlebarsjs学习笔记

    handlebarsjs官网(http://handlebarsjs.com/) 1.引入模板      在html页面中添加 <script id="entry-template&q ...

  3. javascript获取url地址问好后面的值,包括问号

    javascript获取url地址问好后面的值,包括问号 <!DOCTYPE html> <html lang="en"> <head> < ...

  4. Matrix Swapping II(求矩阵最大面积,dp)

    Matrix Swapping II Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. 像web一样使用python

    使用传统的web开发技术,也就是html+js,然后搭配一个后端语言,已经成为当今web开发的固定模式了,为此也形成了众多的toolkit,譬如ror,django,各种js图形库更是玲琅满目,从非常 ...

  6. ObjectiveC中的block用法解析

    Block Apple 在C, Objective-C,C++加上Block这个延申用法.目前只有Mac 10.6 和iOS 4有支持.Block是由一堆可执行的程序组成,也可以称做没有名字的Func ...

  7. C++编程技术之 异常处理(上)

    增强错误恢复能力是提高代码健壮性的最有力途径之一 之所以平时编写代码的时候不愿意去写错误处理,主要是由于这项工作及其无聊并可能导致代码膨胀,导致的结果就是本来就比较复杂的程序变得更加复杂.当然了,前面 ...

  8. JS学习笔记(三)函数

    js中的方法名一般都是首字母小写,其余单词首字母大写的规范. 声明 function 函数名(参数列表) { // 函数体 return 返回值; } 调用 函数名(); (js中花括号喜欢用这种方式 ...

  9. 解决Eclipse无法打开“Failed to load the JNI shared library”(转)

    一般说来,新购笔记本会预装64位的windows系统,而在网上下载软件时,32位会优先出现在页面中(现在来说是这个情况,但我认为未来64位会越来越普及).如果你是64位的系统,却安装了32位的JDK, ...

  10. QT国际化

    写的比较简洁 语言文件: ts:编辑翻译用的,是xml,可以用linguist(qt语言专家)或者Editplus进行翻译 qm:这种文件是ts的release版,无法编辑,发布的时候用这个 操作: ...