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);
    }
    }

  • 相关阅读:
    codevs 1115 开心的金明
    POJ 1125 Stockbroker Grapevine
    POJ 2421 constructing roads
    codevs 1390 回文平方数 USACO
    codevs 1131 统计单词数 2011年NOIP全国联赛普及组
    codevs 1313 质因数分解
    洛谷 绕钉子的长绳子
    洛谷 P1276 校门外的树(增强版)
    codevs 2627 村村通
    codevs 1191 数轴染色
  • 原文地址:https://www.cnblogs.com/CCCrunner/p/6444629.html
Copyright © 2011-2022 走看看