解题思路:
n不超过20,先写一个dfs爆搜。

因为是二维数组,所以把只能向上、左、右走改成了向下、左、右走,起始位置在(0,50),这样向下左右走不会超过边界。

先将起始位置标记为-1,表示不能返回。

以走三步为例,所有可能走过的位置如图所示:

image.png

参考代码:

#include <iostream>
using namespace std;

int dx[3]={1,0,0};//下 左 右
int dy[3]={0,-1,1};
int dp[107][107];
int n,z;
void dfs(int x1,int y1,int k) {
	if(k==n){//走了n步,计数+1 
		z++;
		return;
	}
	for(int i=0; i<3; i++) {//三个方向 
		int x=x1+dx[i],y=y1+dy[i];
		if(dp[x][y]!=-1) {//如果没有走过 
			dp[x][y]=-1;//标记为走过 
			dfs(x,y,k+1);//向下一方向搜索 
			dp[x][y]=1;//因为要回溯,所以重新标记为没有走过 
		}
	}
}

int main() {
	cin>>n;
	dp[0][50]=-1;//起始点标记为-1 
	dfs(0,50,0);
	cout<<z<<endl;
	//打印查看 
//	for(int i=0; i<5; i++) {
//		for(int j=45; j<55; j++)cout<<dp[i][j]<<" \n"[j==54];
//	}

	return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论