帕斯卡(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
*/
### 回答1: Active Directory域服务是一种由微软公司开发的网络服务,它提供了一种集中管理和控制网络资源的方式。它可以在一个域中集中管理用户、计算机、应用程序和其他网络资源,从而提高了网络的安全性和可管理性。Active Directory域服务还提供了一些高级功能,如单点登录、组策略管理和域名系统(DNS)集成等,使得网络管理员可以更加轻松地管理和维护网络。 ### 回答2: Active Directory域服务(Active Directory Domain Services,简称AD DS)是微软公司的一项用于管理和组织网络资源的目录服务。它是一种基于LDAP(轻量级目录访问协议)的目录服务,可以让用户和管理员方便地管理和访问网络中的资源。 AD DS的主要功能包括用户身份认证、访问控制、组管理和资源管理等。通过AD DS,管理员可以集中管理和配置用户和计算机的访问权限,确保系统安全。同时,AD DS还提供了域的集中管理功能,管理员可以通过域控制器管理域中的所有对象,并在域中实施策略。 AD DS还支持单点登录功能,用户只需在登录到域之后,即可自动访问到所属域中的资源,而无需再次输入用户名和密码。这大大提高了用户的工作效率。 此外,AD DS还支持多域架构,可以通过建立信任关系实现跨域资源的访问和管理。管理员可以维护多个域之间的信任关系,实现用户和资源的统一管理。 总而言之,AD DS是一种强大的目录服务,可以实现用户和资源的集中管理和访问控制,提高网络系统的稳定性和安全性。它是企业网络管理的重要组成部分,为企业提供了高效的身份认证和资源管理功能,增强了企业的生产力和安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值