帕斯卡(Pascal)的旅行

问题 N: 【递归与递推 】帕斯卡的旅行

题目
在一个n×n个方格的游戏板中,每个方格中有一个非负整数。游戏的目标是从游戏板的左上角沿任何合法路径移动到右下角。任何一个方格内的数字规定了离开本方格的一步必须移动的方格数。如果移动的一步越出了游戏板,则这个方向的移动是禁止的。每一步移动只能是向下或向右的。考虑如下图所示的4×4的板,这里正体字表示出发位置,斜体字表示目的位置。后面显示了从出发位置到目的位置的三条路径,其中隐去了与每条路径无关的数字。
输入
输入含有n+l行,第1行是游戏板的行数n(4≤n≤34),接下来是n个数据行,每行含有n个0~9的数字,中间没有空格。
输出
在1行中输出从左上角到右下角的路径数(注:输出的路径数使用长整型数据类型)。
思路
一开是以为在移动步数内可以先右走在下走,原来是只能下走或只能右走,WA了两发
1)dp[x][y]+=slove(i,j); ( (i,j)可以通过向下或向右移动a[i][j]步移动到(x,y)处)
2)然后就是当a[i][j]=0时要让dp[i][j]=-1;因为(i,j)可从起点到达,但是无法去到其他点,这个点dp值会一直等于0,然后重复搜索,然后超时
注意
见代码

#include <iostream>
#include <cstdio>
using namespace std;
int n;
int a[40][40];
long long dp[40][40];
long long slove(int x,int y)
{
    if(a[x][y]==0) return dp[x][y]=-1;///防止死循环,因为其走不出去
    if(dp[x][y]) return dp[x][y];
    for(int i=1;i<=x;i++)
    {
        if(x-i==a[i][j])
        {
            long long temp=slove(i,y);
            if(temp!=-1) dp[x][y]+=temp;///可以从(i,y)到达(x,y)
        }
    }
    for(int j=1;j<=y;j++)
    {
        if(y-j==a[i][j])
        {
            long long temp=slove(x,j);
            if(temp!=-1) dp[x][y]+=temp;///可以从(x,j)到达(x,y)
        }
    }
    if(dp[x][y]==0) dp[x][y]=-1;///不可从起点到达
    return dp[x][y];
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%1d",&a[i][j]);
    long long ANS=0;
    dp[1][1]=1,a[n][n]=1;///防止a[n][n]=0;
    ANS=slove(n,n);
    if(ANS!=-1)cout << ANS << endl;///注意-1情况,wa了一发
    else cout<<0<<endl;
    return 0;
}
/*
测试样例
34
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
1111111111111111111111111111111111
7219428434016265740
4
2331
1213
1231
3110
3
*/
发布了95 篇原创文章 · 获赞 7 · 访问量 8454

猜你喜欢

转载自blog.csdn.net/Spidy_harker/article/details/100988372
今日推荐