图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);
}