有限制的dfs
来源:互联网 发布:淘宝模特一个月多少钱 编辑:程序博客网 时间:2024/04/27 17:52
需要剪枝的dfs,剪枝理论难以寻找。。。
这个题目用一般的搜索无法完成,因为题目要求在指定的时间内完成,所以只好一步一步来啦,用DFS解决
但是如果这样结果会超时,网上说是用一种奇偶剪枝的方法来间断搜索时间,下面是剪枝的简单理论,一看就懂:
把map看作 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 从 0->1 需要奇数步 从 0->0 需要偶数步 那么设所在位置 (x,y) 与 目标位置 (dx,dy) 如果abs(x-y)+abs(dx-dy)为偶数,则说明 abs(x-y) 和 abs(dx-dy)的奇偶性相同,需要走偶数步 如果abs(x-y)+abs(dx-dy)为奇数,那么说明 abs(x-y) 和 abs(dx-dy)的奇偶性不同,需要走奇数步 理解为 abs(si-sj)+abs(di-dj) 的奇偶性就确定了所需要的步数的奇偶性!! 而 (ti-setp)表示剩下还需要走的步数,由于题目要求要在 ti时 恰好到达,那么 (ti-step) 与 abs(x-y)+abs(dx-dy) 的奇偶性必须相同 因此 temp=ti-step-abs(dx-x)-abs(dy-y) 必然为偶数!
代码如下
#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include <iostream>#include <algorithm>#include <queue>#include <stack>using namespace std;int map[20][20],visit[20][20];int t;int n, m; int sx, sy, c, b;int dir[4][4] = {{0,1},{0,-1},{1,0},{-1,0}};bool dfs(int x, int y, int ans){ if (ans>t) return false; if (x == c && y == b){ if (ans == t) return true; else return false; } int x1, y1; for (int i = 0; i < 4; i++){ x1 = x + dir[i][0]; y1 = y + dir[i][1]; if (x1 >= 0 && x1 < n && y1 >= 0 && y1 < m && map[x1][y1] && (!visit[x1][y1])){ visit[x1][y1] = 1; if (dfs(x1,y1,ans+1)) return true; visit[x1][y1] = 0;//不符合条件,重新设置没访问过的 } } return false;}int main(){ char z; int i, j; while(cin>>n>>m>>t){ if (n+m+t == 0) break; memset(map,0,sizeof(map)); memset(visit,0,sizeof(visit)); for (i = 0; i < n; i++){ for (j = 0; j < m; j++){ cin>>z; if (z == 'S'){ map[i][j] = 1; visit[i][j] = 1; sx = i; sy = j; } if (z == '.') map[i][j] = 1; if (z == 'D'){ map[i][j] = 1; c = i; b = j; } } } if ((t- abs(sx-sy)- abs(c-b))%2 == 1){//奇偶剪枝 printf("NO\n"); continue; } if (dfs(sx,sy,0)){ printf("YES\n"); } else{ printf("NO\n"); } } return 0;}
阅读全文
0 0
- 有限制的dfs
- POJ 1724 ROADS (有限制的最短路径DFS/BFS)
- ZOJ 3861 Valid Pattern Lock(深度优先遍历dfs,有限制条件的全排列)
- 它们有相同的限制
- 关于命令行缓存有限制的解决
- CSDN 的评论有数字限制?
- 有上下界限制的网络流
- hdu4396 spfa有限制的最短路
- 有限制的Burnside , 矩阵幂
- Wifi的密码长度有何限制
- poj 1062(有限制的最短路)
- poj 1724(有限制的最短路)
- hdu4885 有 限制的最短路
- Wifi的密码长度有何限制
- ie兼容属性是有限制的
- 有物品数量限制的背包问题
- 51nod1296 有限制的排列
- select真的有限制吗
- Docker下dubbo开发,三部曲之二:本地环境搭建
- 图像拼接之MATLAB实现
- WebApp那些事——(JqueryMobile) 实战(二)
- 十六进制转十进制
- 数据结构——顺序表
- 有限制的dfs
- IOS文件系统,文件管理器
- Class.forName和ClassLoader的区别及Native关键字介绍
- C++通过hiredis执行redisCommand后怎么准确的取出数据
- 控制只添加另一个控制器的view,手势不响应
- http协议深入理解
- C#实现数据回滚,A事件和B事件同时执行,其中任何一个事件执行失败,都会返回失败
- 共享文件夹
- 求树的直径端点和距离