原题链接:蛇形填数
解题思路:通过dfs填写最方便 详解请看代码
注意事项:1、向下和向右都能走时要向右走,需要特判
2、for循环找方向时要按照下左上右的顺序
3、每行最后一个元素后没有空格
参考代码:
#include<iostream> using namespace std; const int N=110; int a[N][N],n; int dx[4]={1,0,-1,0},dy[4]={0,-1,0,1}; //方向按照下左上右 bool find(int xx,int yx) //判断能不能走 { if(a[xx][yx]==0&&xx>0&&yx>0&&xx<=n&&yx<=n) //没走过并且没出界 return true; return false; } void dfs(int x,int y,int t) { a[x][y]=t; // 给数组相应位置赋值 if(t==n*n) // 最后一个数为n*n,结束 return ; if(find(x+1,y)&&find(x,y+1)) //如果向右向下都能走 则向右走 dfs(x,y+1,t+1); for(int i=0;i<4;i++) { int xx=x+dx[i],yx=y+dy[i]; if(find(xx,yx)) dfs(xx,yx,t+1); } } int main(void) { while(cin>>n){ for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) a[i][j]=0; //初始化数组为0 dfs(1,n,1); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) if(j==n) cout<<a[i][j]<<endl; //最后一个元素输出换行 else cout<<a[i][j]<<' '; } cout<<endl;} return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复