Pascal的旅行

本文介绍了一种使用递归算法解决特定游戏板路径问题的方法。在一个nxn的游戏板上,通过递归函数计算从左上角到右下角的所有合法路径数量,每次移动仅限向右或向下,移动距离由当前位置的非负整数值决定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一块的nxn游戏板上填充着整数,每个方格上为一个非负整数。目标是沿着从左上角到右下角的任何合法路径行进,方格中的整数决定离开该位置的距离有多大,所有步骤必须向右或向下。请注意,0是一个死胡同。

      图1所示的4 x 4板,其中实心圆标识起始位置,虚线圆标识目标,图2显示了从开始到目标的三个路径。

                     

                                    图1


                                   图2

【输入形式】

       输入开始是一个正整数n(4<=n<=30), 接下来的n行,每行输入n个0~9中的一个数字,数字间用空格隔开。

【输出形式】

      输出一个整数,表示从左上角到右下角的路径数。

【样例输入】

4
2 3 3 1
1 2 1 3
1 2 3 1
3 1 1 0

【样例输出】3


这题要求走格子,并且只能单向向右或者向下走。并且走的格子数目为目前对应的数字。

所以考虑使用递归。

在这里还是要注意递归的一些写法

1.注意sum声明位置。如果sum在外部,则表明sum是一个全局变量,任何一个有修改sum值的行为都会使sum的值永久性地被修改,所以sum的声明还是要声明在dfs函数的内部。这样的话,第一个sum就像于真正意义上的sum-总步数,其余的sum实际上就是一个计数的工具。反正最后return回给sum总值。
2.注意特殊情况的发生。if(a[x][y]!=0) 就防止了死循环的发生,当某一个值为0的时候,此时的步数就限制在了该位置,无法进行位移


#include<iostream>
#include<iomanip>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
int n;
int a[1000][1000];
/*递归的写法注意点
1.注意sum声明位置。如果sum在外部,则表明sum是一个全局变量,任何一个有修改sum值的行为都会使sum的值永久性地被修改,所以sum的声明还是要声明在dfs函数的内部。
 这样的话,第一个sum就像于真正意义上的sum-总步数,其余的sum实际上就是一个计数的工具。反正最后return回给sum总值。
2.注意特殊情况的发生。if(a[x][y]!=0) 就防止了死循环的发生,当某一个值为0的时候,此时的步数就限制在了该位置,无法进行位移
*/
int dfs(int x,int y)
{
 int sum=0;
 if(x<=n-1&&y<=n-1)
 {
  
   if(x==n-1&&y==n-1) return 1;
   else
   if(a[x][y]!=0){
  sum+=dfs(x+a[x][y],y);
  sum+=dfs(x,y+a[x][y]);
   }
    }
    else return 0;
 return sum; 
}
int main()
{
 cin>>n;
 for(int i=0;i<n;i++)
 for(int s=0;s<n;s++) cin>>a[i][s];
 cout<<dfs(0,0);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值