原题链接:踩方格
解题思路:
n不超过20,先写一个dfs爆搜。
因为是二维数组,所以把只能向上、左、右走改成了向下、左、右走,起始位置在(0,50),这样向下左右走不会超过边界。
先将起始位置标记为-1,表示不能返回。
以走三步为例,所有可能走过的位置如图所示:
参考代码:
#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分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复