【C++】Pascal的旅行

一块的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);
	}
} 





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值