zoukankan      html  css  js  c++  java
  • 迷宫问题

    http://acm.zznu.edu.cn/problem.php?id=1358

    迷宫问题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 111  解决: 68
    [提交][状态]

    题目描述

    ACM是一个喜欢玩游戏的小孩,他喜欢玩智力游戏,比如最近在玩走迷宫,这是一款超级耗费脑细胞的游戏

    和普通的走迷宫一样,游戏是一张迷宫图,其中有一些标记,'W'是墙,'.'是可走的路,起点在左上角,目标点在右下角。ACM从左上角出发,只能向下和向右走,游戏要你找出有多少种不同的走法。很有压力吧?那是对于非计算机专业的人来说!你怎么看?试试吧。

    输入

    首先输入一个整数T,表示接下来有T(0<T<=10)个测试实例。

    每组测试实例第一行是两个整数n(0<n<=10)和m(0<m<=10),表示游戏是在一张n*m的迷宫图上进行,接下来是一个n*m的迷宫图。

    具体输入见样例。

    输出

    每组样例输出一个整数,表示ACM有多少种不同的走法。

    具体输出见样例。

    样例输入

    2
    2 2
    .w
    .w
    3 3
    ...
    w..
    ...
    

    样例输出
    0
    3
    
    代码:
    #include<stdio.h>

    int main()
    {
        int n, m, t, i, j, dp[15][15];
        char p[15][15];

        scanf("%d", &t);

        while(t--)
        {
            scanf("%d%d", &n, &m);

            for(i = 0; i < n; i++)
                scanf("%s", p[i]); // 用字符串的形式输入,因为中间会有换行,还方便

            for(i = 0; i <= n; i++)
                dp[i][0] = 0;
            for(j = 0; j <= m; j++)
                dp[0][j] = 0; //清零

            dp[0][1] = 1; //没有这一步,没有ac

            if(p[0][0] == 'w' || p[n-1][m-1] == 'w')
            {
                printf("0 ");
                continue; //第一步或最后一步是‘w’,没有走法
            }
            for(i = 1; i <= n; i++)
            {
                for(j = 1; j <= m; j++)
                {
                    if(p[i-1][j-1] == 'w') // 代码的点:dp下标和地图p下标不是对应的。横竖坐标都错了一个,目的是方便dp加数
                        dp[i][j] = 0; //w,即使有别的点到这一步,这一步也到不了其他地方,所以置零
                    else
                        dp[i][j] = dp[i-1][j] + dp[i][j-1]; //这一点只能由它左边的或上边的点到,所以走法,dp,是它们两个的和
                }
            }
            printf("%d ", dp[n][m]); // 输出最后一个的dp,不同走法
        }
        return 0;
    }
    还可以用递归来写:

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>

    using namespace std;

    #define N 18
    int ans, n, m;
    char p[N][N];

    void f(int x, int y)
    {
        if(x < 0 || x >= n || y < 0 || y >= m)
            return ;
        else if(x ==n-1 && y == m-1 && p[x][y] == '.')
        {
            ans++;
            return;
        }
        else if(p[x][y] == '.')
        {
            f(x, y+1);
            f(x+1, y);
        }
        else if(p[x][y] == 'w')
            return ;

    }
    int main()
    {
        int t, i;

        scanf("%d ", &t);
        while(t--)
        {
            scanf("%d%d", &n, &m);
            for(i = 0; i < n; i++)
                scanf("%s", p[i]);
            ans = 0;
            f(0, 0);
            printf("%d ", ans);
        }
        return 0;
    }

    之前同学一直都有说我,把worm那题:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=31179,弄明白,这题肯定会,我现在也这么觉着。

    但是,之前worm我也是明白了的啊,对于自己也是够了

    worm代码:

    #include<stdio.h>
    #include<string.h>
    
    #define maxn 105
    
    int dp[maxn][maxn];
    
    int main()
    {
      int i, j, n, p, m, t;
    
      while(scanf("%d%d%d%d", &n, &p, &m, &t) != EOF)
      {
        memset(dp, 0, sizeof(dp));
        dp[0][p] = 1;
    
        for(i = 1; i <= m; i++)
          for(j = 1; j <= n; j++)
          dp[i][j] += dp[i-1][j-1] + dp[i-1][j+1];
    
        printf("%d
    ", dp[m][t]);
      }
      return 0;
    }
    相对worm,这题没有出现自己觉着代码一样,ac不了的情况=·=||

    这一篇博客真不容易

    浏览器又想坏事,先提交了(投诉火狐==|| 试试谷歌orzZ

    让未来到来 让过去过去
  • 相关阅读:
    python的各版本的不同
    keras中的early stopping
    NER的数据处理
    ner处理数据的方式
    python的数据处理一
    linux下的终端利器----tmux
    BiseNet学习笔记
    《Harnessing Synthesized Abstraction Images to Improve Facial Attribute Recognition》论文阅读笔记
    转:玩玩三维重建
    《Cascaded Pyramid Network for Multi-Person Pose Estimation》论文阅读及复现笔记
  • 原文地址:https://www.cnblogs.com/Tinamei/p/4466955.html
Copyright © 2011-2022 走看看