一块的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.利用阉割版的dfs搜索(本题的特殊规定只能向右边或者向下边移动,不存在回头的情况,故不需要标记数组)
#include<iostream>
using namespace std;
void dfs(int*p,int& count,int x,int y,int n);
int main(){
int n;
cin>>n;
int a[n][n];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>a[i][j];
}
}
int count=0;
dfs(a[0],count,0,0,n);
cout<<count;
return 0;
}
void dfs(int*p,int& count,int x,int y,int n){
if(x==n-1&&y==n-1){
count++;return;
}
if(*(p+x*n+y)==0||x>=n||y>=n)return;
int m=*(p+x*n+y);
dfs(p,count,x+m,y,n);
dfs(p,count,x,y+m,n);
}
2.利用指针数组生成一颗二叉树,然后使用二叉树的先序遍历
#include<iostream> using namespace std; struct node{ int data; node* down; node* right; }; void numofways(node* ,int* ,node* ); int main(){ int n; cin>>n; node* p[n][n]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ p[i][j]=new node; cin>>p[i][j]->data; } } for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ p[i][j]->down=p[i][j]->right=NULL; int move=p[i][j]->data; if(move==0)continue; if((i+move)<=(n-1))p[i][j]->down=p[i+move][j]; if((j+move)<=(n-1))p[i][j]->right=p[i][j+move]; } } int sum=0; numofways(p[0][0],&sum,p[n-1][n-1]); cout<<sum; return 0; } void numofways(node* p,int* sum,node* end){ if(p!=NULL){ if(p==end){ (*sum)++; } numofways(p->right,sum,end); numofways(p->down,sum,end); } }