迷宫问题

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

让未来到来 让过去过去
原文地址:https://www.cnblogs.com/Tinamei/p/4466955.html