原题链接:蛇形填数
参考代码:
首先定义数组 输入格数
#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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复