原题链接:蛇形填数
参考代码:
首先定义数组 输入格数
#include <bits/stdc++.h> using namespace std; int a[1100][1100]; int main() { int n; while(cin>>n) { xxxxxxx; } return 0; }
定义x,y为要填充的坐标,
f为方向,i为要填充的数。
#include <bits/stdc++.h> using namespace std; int a[1100][1100]; int main() { int n; while(cin>>n) { memset(a,0,sizeof a); int x,y,i=0,f=2/* 1:上 2:下 3:左 4:右 */; x=1; //x从第一行开始 y=n; //y从最后一列开始 while(1) { i++; //依次填 a[x][y]=i; if(i==n*n) //如果全填完就结束循环 { break; } if(f==1) { x-=1; } else if(f==2) { x+=1; } else if(f==3) { y-=1; } else if(f==4) { y+=1; } } for(int k=1; k<=n; k++) //输出填的数 { for(int j=1; j<=n; j++) { cout<<a[k][j]<<' '; } cout<<endl; } cout<<endl; } return 0; }
如果上面碰边,右面也碰边
方向改为下,上边向下一格
如果右面碰边,下面也碰边
方向改为左,右边向左一格
......以此类推
#include <bits/stdc++.h> using namespace std; int a[1100][1100]; int main() { int n; while(cin>>n) { memset(a,0,sizeof a); int x=1,y,i=0,f=2/* 1:上 2:下 3:左 4:右 */; y=n; int z1=1,z2=n,z3=1,z4=n; //z1:上 z2:下 z3:左 z4:右(壁) while(1) { i++; a[x][y]=i; if(i==n*n) { break; } if(z1==x&&z4==y&&i!=1) { f=2; z1++; } else if(z4==y&&z2==x) { z4--; f=3; } else if(z2==x&&z3==y) { f=1; z2--; } else if(z3==y&&z1==x) { z3++; f=4; } if(f==1) { x-=1; } else if(f==2) { x+=1; } else if(f==3) { y-=1; } else if(f==4) { y+=1; } } for(int k=1; k<=n; k++) { for(int j=1; j<=n; j++) { cout<<a[k][j]<<' '; } cout<<endl; } cout<<endl; } return 0; }
但这时运行
会出现以下情况
#include <bits/stdc++.h> using namespace std; int a[1100][1100]; int main() { int n; while(cin>>n) { memset(a,0,sizeof a); int x=1,y,i=0,f=2/* 1:上 2:下 3:左 4:右 */,b1=-1,b2=-1,b3=-1,b4=-1; y=n; int z1=1,z2=n,z3=1,z4=n; //z1:上 z2:下 z3:左 z4:右 while(1) { b1--; b2--; b3--; b4--; i++; a[x][y]=i; if(i==n*n) { break; } if(z1==x&&z4==y&&i!=1) { f=2; b1=2; } else if(z4==y&&z2==x) { b2=2; f=3; } else if(z2==x&&z3==y) { f=1; b3=2; } else if(z3==y&&z1==x) { b4=2; f=4; } if(f==1) { x-=1; } else if(f==2) { x+=1; } else if(f==3) { y-=1; } else if(f==4) { y+=1; } if(b1==0) { z1+=1; } else if(b2==0) { z4-=1; } else if(b3==0) { z2-=1; } else if(b4==0) { z3+=1; } } for(int k=1; k<=n; k++) { for(int j=1; j<=n; j++) { cout<<a[k][j]<<' '; } cout<<endl; } cout<<endl; } return 0; }
0.0分
3 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复