HDU 1010 深度搜索问题
2016-02-05 21:27
337 查看
杭电ACM 1010
题意 :
能否在 恰好T步时 从S点到达 D点,每个点只能走一次,X是障碍。
注意不能提前到达,必须在T步时到达
我用的深度搜索dfs,最重要的是超时问题。
这里涉及到一个剪枝,我在网上看到的奇偶剪枝。
M * N的 {0,1} 矩阵
0,1,0,1,0
1,0,1,0,1
0,1,0,1,0
1,0,1,0,1
可以看到从任意一个0到任意一个1,或者从任意一个1到任意一个0,都需要奇数步,如果程序剩下的步数为偶数,此时可以直接return 了。
同理,从任意一个0到任意一个0,或者从任意一个1到任意一个1,都需要偶数步。
题意 :
能否在 恰好T步时 从S点到达 D点,每个点只能走一次,X是障碍。
注意不能提前到达,必须在T步时到达
我用的深度搜索dfs,最重要的是超时问题。
这里涉及到一个剪枝,我在网上看到的奇偶剪枝。
M * N的 {0,1} 矩阵
0,1,0,1,0
1,0,1,0,1
0,1,0,1,0
1,0,1,0,1
可以看到从任意一个0到任意一个1,或者从任意一个1到任意一个0,都需要奇数步,如果程序剩下的步数为偶数,此时可以直接return 了。
同理,从任意一个0到任意一个0,或者从任意一个1到任意一个1,都需要偶数步。
#include<stdio.h> #include<math.h> #include<stdlib.h> int N, M, T; int flag, dx, dy, sx, sy; char **map; void dfs(int sx, int sy, int count) { if(sx == dx && sy == dy && count == T) { flag = 1; return; } if(flag == 1) return ; if((sx + sy) % 2 == (dx + dy) % 2) //进行奇偶剪枝 { if((T-count) % 2 == 1) return ; } else { if((T-count) % 2 == 0) return ; } if(count == T && (sx != dx || sy != dy)) return; int i; for(i=0; i<4; i++) { int x,y; x = sx , y = sy; if(i == 0) x = sx - 1; else if(i == 1) x = sx + 1; else if(i == 2) y = sy - 1; else y = sy + 1; if(x >= 0 && x < M && y >= 0 && y < N && map[x][y] != 'X') { map[x][y] = 'X'; dfs(x,y,count+1); map[x][y] = '.'; } } } int main() { while(scanf("%d%d%d", &M,&N,&T) != EOF) { getchar(); flag = 0; if(N == 0 && M == 0 && T == 0) break; int i, j, count = 0; map = (char **)malloc(sizeof(char *) * M); //动态分配一个二维数组 for(i=0; i<M; i++) map[i] = (char *)malloc(sizeof(char) * N); for(i=0; i<M; i++) { for(j=0; j<N; j++) { map[i][j] = getchar(); if(map[i][j] == 'S') { sx = i; sy = j; map[i][j] = 'X'; } else if(map[i][j] == 'D') { dx = i; dy = j; count ++; } else if(map[i][j] == '.') count ++; } getchar(); } if(count >= T) dfs(sx,sy,0); if(flag == 1) puts("YES"); else puts("NO"); } return 0; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法