走迷宫
2015-06-16 21:51
281 查看
走迷宫
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
一个由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<bits/stdc++.h> using namespace std; int n,m; int a[1000][1000]; int vis[1000][1000]; int sum; int dx[]={1,0,-1,0}; int dy[]={0,1,0,-1}; int DFS(int x,int y) { if(x>n||x<1||y>m||y<1||a[x][y]) return 0; if(x==n&&y==m) { sum++; return 0; } if(!vis[x][y]) { vis[x][y]=1; for(int i=0;i<4;i++) {int xx=x+dx[i]; int yy=y+dy[i]; if(xx<=n&&xx>=1&&yy<=m&&yy>=1&&!a[xx][yy]&&!vis[xx][yy]) DFS(xx,yy); } vis[x][y]=0; } } int main() { int T; cin>>T; while(T--) { sum=0; memset(vis,0,sizeof(vis)); cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j]; DFS(1,1); cout<<sum<<endl; } }
相关文章推荐
- Ubuntu 14.04 启用休眠
- 第二次站立会议3
- LeetCode:Count Primes
- phpstudy在linux下的初体验-----php文件放置目录
- Ubuntu的挂起和休眠
- Android源码项目目录结构
- 全局程序集GlobalAssemblyInfo.cs进行版本控制(引)
- 怎样在win7上远程连接linux系统
- Qt中使用GridLayout如何设置一个按钮占两个位置
- rsyslog netconsole(debian)二
- Execution failed for task ':dexDebug' Android Studio 编译失败
- Android获取手机屏幕像素
- 使用多线程改进网站客户端响应能力
- 【BZOJ】【3930】【CQOI2015】选数
- 第二次站立会议2
- [C/CPP系列知识] C++中extern “C” name mangling -- Name Mangling and extern “C” in C++
- Java优先级队列PriotyQueue
- java之包含min函数的栈
- 泛型的详细使用
- 括号匹配