【解题报告】hdu1010 Tempter of the Bone
来源:互联网 发布:php 订阅号自定义菜单 编辑:程序博客网 时间:2024/04/29 08:38
原题请看这里。
题目是一道迷宫类问题,独特之处在于,不需要尽少步数到达目标点,而必须经过特定步数到达终点(庙门会在特定时间开启,而且只有一瞬间)。另外,每个点只能走一次。
由于只需要一条符合条件的路径到达目标点即可,所以采用DFS比较好。考虑到步数0 < T < 50,粗略估计(4^T),即便一些走过的点不能再走,时间复杂度仍然难以接受。
考虑剪枝,一方面,一个显而易见的事实是,如果剩下的步数小于当前点到目标点的最小距离,则一定不能到达。
另外,在开始DFS前,有两个判定:
1. 如果T大于点的个数,则不能到达。(不知道会不会有这样的数据)
2. 奇偶剪枝。图中,从0点到任意一个0点需要偶数步,到任意一个1点,需要奇数步。所以可以通过开始点,目标点与T的情况,直接进行判断。
#include<stdio.h>#include<string.h>#include<stdlib.h> //没加一系列头文件居然是Wa而不是Ceconst int dx[]= {0,0,0,1,-1},dy[]= {0,1,-1,0,0};int map[10][10],used[10][10],sx,sy,tx,ty,n,m,t;int dfs(int x,int y, int step){ int i,xx,yy; if (step==t) { if (x==tx&&y==ty) return 1; return 0; } if (t-step<abs(tx-x+ty-y)) return 0;//剪枝 for (i=1; i<=4; i++) { xx=x+dx[i]; yy=y+dy[i]; if (map[xx][yy]&&(!used[xx][yy])) { used[xx][yy]=1; if(dfs(xx,yy,step+1)) return 1; used[xx][yy]=0; } } return 0;}int main(){ int i,j; while (scanf("%d%d%d",&n,&m,&t)&&(n||m||t)) { getchar(); memset(map,0,sizeof(map)); memset(used,0,sizeof(used)); for (i=1; i<=n; i++) { for (j=1; j<=m; j++) switch(getchar()) { case 'S': { sx=i; sy=j; break; } case 'D': { tx=i; ty=j; map[i][j]=1; break; } case '.': { map[i][j]=1; break; } case 'X': ; default : ; }; getchar(); } if (((abs(sx-tx)+abs(sy-ty))%2!=t%2)||!dfs(sx,sy,0)) printf("NO\n"); //预判 else printf("YES\n"); } return 0;}
- 【解题报告】hdu1010 Tempter of the Bone
- HDU1010 Tempter of the Bone 解题报告--dfs
- HDU1010 Tempter of the Bone
- Tempter of the Bone hdu1010
- (hdu1010)Tempter of the Bone
- hdu1010 Tempter of the Bone
- HDU1010 Tempter of the Bone
- HDU1010 Tempter of the Bone
- HDU1010:Tempter of the Bone
- HDU1010 Tempter of the Bone
- HDU1010 Tempter of the Bone
- hdu1010(Tempter of the Bone)
- hdu1010 Tempter of the Bone
- HDU1010 Tempter of the Bone
- hdu1010 Tempter of the Bone
- hdu1010 Tempter of the Bone
- hdu1010 Tempter of the Bone
- hdu1010---Tempter of the Bone
- 二、Input and output-2013-4-9
- Socket中的TIME_WAIT状态
- android113--onConfigurationChanged
- Linux tasklet 分析笔记
- 【C++ STL学习之四】容器list深入学习
- 【解题报告】hdu1010 Tempter of the Bone
- MFC框架略分析
- 理解c++对象模型,子类与父类关系
- MFC中修改初始对话框标题和名字
- 【C++ STL学习之六】STL算法之for_each
- Hadoop集群安装&Hbase实验环境搭建【1】
- JAVA 网络编程 UDP(聊天程序)
- ubuntu server 配置ftp server
- Windows Azure地缘组 (Affinity Group)