NYOJ-499-迷宫
2016-04-15 20:38
162 查看
迷宫
时间限制:1000 ms | 内存限制:65535 KB难度:4
描述 一个由 n * m 个格子组成的迷宫,起点是(1, 1), 终点是(n, m),每次可以向上下左右四个方向任意走一步,并且有些格子是不能走动,求从起点到终点经过每个格子至多一次的走法数。
输入第一行一个整数 T 表示有 T 组测试数据。(T <= 110)
对于每组测试数据:
第一行两个整数 n, m,表示迷宫有 n * m 个格子。(1 <= n, m <= 6, (n, m) !=(1, 1) ) 接下来 n 行,每行 m 个数。其中第 i 行第 j 个数是 0 表示第 i 行第 j 个格子可以走,否则是 1 表示这个格子不能走,输入保证起点和终点都是都是可以走的。任意两组测试数据间用一个空行分开。输出对于每组测试数据,输出一个整数 R,表示有 R 种走法。样例输入
3 2 2 0 1 0 0 2 2 0 1 1 0 2 3 0 0 0 0 0 0
样例输出
1 0 4
深搜遍历,递归实现
#include <stdio.h> #include <string.h> int r=0,n,m; bool map[7][7], book[7][7]; void DFS(int i, int j) { if(i < 1 || i > n || j < 1 || j > m || map[i][j] || book[i][j]) return; if(i == n && j == m) { r++; return; } book[i][j] = true; DFS(i, j + 1); DFS(i, j - 1); DFS(i + 1, j); DFS(i - 1, j); book[i][j] = false; } int main() { int t,i,j; scanf("%d",&t); while(t--) { r=0; memset(book,false,sizeof(book)); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&map[i][j]); } } DFS(1,1); printf("%d\n",r); } return 0; }
相关文章推荐
- 《VR入门系列教程》之20---使用Oculus移动端SDK
- php下foreach()错误提示Warning: Invalid argument supplied for foreach()
- 面试题:什么叫红黑树
- 查找算法——————二分搜索
- Spring实践:面向切面编程(AOP)
- EFI引导及GPT分区
- 了解四大主流浏览器内核
- Java 框架思路.doc
- 《VR入门系列教程》之19---GearVR开发初识
- sendBroadcast与sendStickyBroadcast的区别
- android TextView属性的详细介绍 分享
- 216. Combination Sum III
- 横向滑动类listview 带回弹效果
- NYOJ-27-水池数目
- Ehcache文档_单点登录.doc
- NetworkManager详解
- 克隆带子模块的项目
- slidingmenu添加到androidStudio
- gcc:error trying to exec 'cc1obj':execvp:No such file or directory
- eclipse控制台乱码