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

    走迷宫

    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 <string.h>
    int a[7][7],b[7][7];
    int m,n,ans=0;//ans 计数(到迷宫的途径)
    void dfs(int i,int j)
    {
    if(a[i][j] || b[i][j]) //路不通,返回上一层递归
    {
    return ;
    }
    if(i==n && j==m) //到达终点技术结束
    {
    ans++;
    return ;
    }
    b[i][j] = 1; //记录走过的路
    dfs(i+1,j); //向下走
    dfs(i-1,j); //若向上走不通,退回上一步,暨向上走
    dfs(i,j+1); //向右走
    dfs(i,j-1); //向左走
    b[i][j]=0; //初始化,方便下一步走路


    }
    int main()
    {
    int i,j;
    int t;
    scanf("%d",&t);
    while(t--)
    {
    scanf("%d%d",&n,&m);
    memset(b,0,sizeof(b));
    for(i=0;i<=n+1;i++)  //迷宫格子初始化
    {
    for(j=0;j<=m+1;j++)
    {
    a[i][j] = 1;
    }
    }
    for(i=1;i<=n;i++)   //设置棋盘
    {
    for(j=1;j<=m;j++)
    {
    scanf("%d",&a[i][j]);
    }
    }
    ans = 0;
    dfs(1,1);
    printf("%d\n",ans);
    }
    }

  • 相关阅读:
    mac c++编译出现segmentation fault :11错误
    ssh 连接缓慢解决方法
    237. Delete Node in a Linked List
    203. Remove Linked List Elements
    Inversion of Control Containers and the Dependency Injection pattern
    82. Remove Duplicates from Sorted List II
    83. Remove Duplicates from Sorted List
    SxsTrace
    使用CCleaner卸载chrome
    decimal and double ToString problem
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/11782170.html
Copyright © 2011-2022 走看看