hdoj 1010 Tempter of the Bone
2015-08-16 20:11
441 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010
这个题目主要考察深搜,其中用到了几个比较简单的剪枝技巧:
1.起点到终点的曼哈顿距离与时间t的奇偶性要相同,否则直接pass
2.路径上的任一点到终点的曼哈顿距离要不大于t,否则的话无论如何也无法到达终点
3.整个地图里的”.“的个数要大于t。显然如果”.“的个数大于t,就算把”.“都走完也没到开门的时间,只能挂掉了。(这个本以为没啥用,于是一直TLE。到最后百度一下,发现就是缺了这个,加上以后就过了)
代码如下
这个题目主要考察深搜,其中用到了几个比较简单的剪枝技巧:
1.起点到终点的曼哈顿距离与时间t的奇偶性要相同,否则直接pass
2.路径上的任一点到终点的曼哈顿距离要不大于t,否则的话无论如何也无法到达终点
3.整个地图里的”.“的个数要大于t。显然如果”.“的个数大于t,就算把”.“都走完也没到开门的时间,只能挂掉了。(这个本以为没啥用,于是一直TLE。到最后百度一下,发现就是缺了这个,加上以后就过了)
代码如下
#include <iostream> #include <string> #include <iomanip> #include <stack> using namespace std; int si,sj,ei,ej; int f[4]={1,-1,0,0},g[4]={0,0,1,-1};// int abst(const int&a) { if(a<0) return -a; return a; } struct node { bool visit; int short_dis; int type; }; stack<node> route; node p[9][9]; void init(int a,int b) { for(int i(0);i<=b;i++) for(int j(0);j<=a;j++) p[i][j].visit = 0,p[i][j].short_dis = abst(ei-i)+abst(ej-j); for(int i(0);i<=b+1;i++) p[i][0].type = 0; for(int i(0);i<=b+1;i++) p[i][a+1].type=0; for(int i(0);i<=a+1;i++) p[0][i].type=0; for(int i(0);i<=a+1;i++) p[b+1][i].type=0; p[si][sj].visit = 1; } bool legal(const node& x) { return !x.visit&&(x.type!=0); } bool dfs(const int&x,const int&y,const int&t) { if(t==0) if(p[x][y].type == -1) return 1; else return 0; if(p[x][y].short_dis%2!=t%2) return 0; if(t<p[x][y].short_dis) return 0; bool flag = 0; for(int i(0);i<4;i++) { if(legal(p[x+f[i]][y+g[i]])) { p[x+f[i]][y+g[i]].visit = 1; flag = dfs(x+f[i],y+g[i],t-1); p[x+f[i]][y+g[i]].visit = 0; if(flag) return 1; } } return 0; } int main() { int a,b,t; char type; int remain; while(cin >>a>>b>>t&&a&&b&&t) { remain = 0; for(int i(1);i<=b;i++) for(int j(1);j<=a;j++) { cin >> type; if(type =='S') { si = i; sj = j; } else if(type == 'D') { ei = i; ej = j; } if(type=='X') p[i][j].type = 0; else if(type=='.'){ p[i][j].type = 1; remain++; } else if(type == 'D') p[i][j].type = -1; else p[i][j].type = 1; } if(remain+1<t){ cout << "NO"<<endl; continue; } init(a,b); if(dfs(si,sj,t)) cout << "YES"<<endl; else cout << "NO"<<endl; } }
相关文章推荐
- 程序员从优秀到卓越的几点建议
- poj 3057 Evacuation(强大的二分图匹配)
- 2015-07-30-functional-programming
- HDOJ 题目分类
- poj 2689 Prime Distance 筛素数加强版
- Wildcard Matching
- JVM总结
- 使用函数的小细节
- ACM数论基础之一_______质因数分解
- error LNK2019: 解析的外部符号 __imp__DispatchMessageW@4,在函数的符号 _WinMain@16 据引述
- JAVA反射机制获取类和方法
- codefroces 并查集 250 D
- 杭州电子科技大学acm---2008
- mysql查询语句
- 树结构的自定义及基本算法(Java数据结构学习笔记)
- ubuntu卸载安装包
- Django(中)
- 默认开机启动;通过Broadcastreceiver广播监听开机启动,实现"没有activity"的自启服务或者自启应用程序。
- 九度oj 1055
- 【Java设计模式】单例模式