zoukankan      html  css  js  c++  java
  • 走迷宫

    题目描述

    一个由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
     1 #include<stdio.h>
     2 #include<string.h>
     3 int map[101][101],vis[101][101];
     4 int n,m,ans;
     5 void dfs(int x,int y)
     6 {
     7     if(vis[x][y] || map[x][y])
     8         return;
     9     if(x == n && y == m)
    10     {
    11         ans++;
    12         return;
    13     }
    14     vis[x][y] = 1;
    15     dfs(x-1,y);dfs(x+1,y);
    16     dfs(x,y-1);dfs(x,y+1);
    17     vis[x][y] = 0;
    18 }
    19 int main()
    20 {
    21     int t;
    22     scanf("%d",&t);
    23     while(t--)
    24     {
    25         scanf("%d %d",&n,&m);
    26         memset(vis,0,sizeof(vis));
    27         for(int i = 1; i <= n; i++)
    28             for(int j = 1; j <= m; j++)
    29                 scanf("%d",&map[i][j]);
    30         for(int i = 0; i <= n+1; i++)
    31         {
    32             map[i][0] = 1;
    33             map[i][m+1] = 1;
    34         }
    35         for(int j = 0; j <= m+1; j++)
    36         {
    37             map[0][j] = 1;
    38             map[n+1][j] = 1;
    39         }
    40         ans = 0;
    41         dfs(1,1);
    42         printf("%d
    ",ans);
    43     }
    44     return 0;
    45 }
    View Code
  • 相关阅读:
    网络操作系统(WebOS)网站
    各种邀请码:Evernote 3.0,wallop,qolin等等
    urlrewrite 的使用方法
    一次事故处理情况(mysql 相关)
    开始使用ubuntu办公
    Q邻:网络桌面
    数据库表字段命名规范
    计算机专业导学
    详解GCC的下载和安装
    三层的解释
  • 原文地址:https://www.cnblogs.com/LK1994/p/3151819.html
Copyright © 2011-2022 走看看