走迷宫
来源:互联网 发布:软件著作权 无形资产 编辑:程序博客网 时间:2024/05/01 07:57
走迷宫
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 种走法。
示例输入
32 20 10 02 20 11 02 30 0 00 0 0
示例输出
104
提示
#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; }}
0 0
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 走迷宫
- 使用多线程改进网站客户端响应能力
- 共享onload事件
- Android获取手机屏幕像素
- phpstudy在linux下的初体验-----php文件放置目录
- Android——View、ViewGroup事件(Touch事件)处理机制总结
- 走迷宫
- Android的SoundPool
- Qt+VS2010的配置
- HC-SR501 人体红外感应模块
- php学习整理之mysql(三)配置php使其支持mysql
- 二叉树中和为某一值的路径
- LaTeX学习教程 持续更新
- java之栈的压入和弹出
- 双向队列