问题描述:输入正整数n(n<30),输出1到n的蛇形矩阵;
例如:
n=10时
1 2 6 7
3 5 8
4 9
10
思路:分为右拐和下拐两个动作,每次进行到第0行时右拐,进行到第0列时下拐;每次拐弯移动的步数相比上次拐外都加 1;右拐后,每走一步需要向左下位置(下一行前一列)赋值;下拐后,每走一步需要向右上位置(上一行后一列)赋值。思路来源于青蓝向日葵前辈的下方链接;
代码:
#include<stdio.h>
void snake_bloking()
{
int a[20][20]={0},m=1,n=0,i=0,j=0,k=0; //设置一个可以装下蛇的数组,i控制行,j控制列;m存入数字,n输出长度,k记录拐弯后步数
printf("请输入蛇的长度(0<n<30,正整数):");
while(scanf("%d",&n),n>=30||n<1);
a[0][0]=m;//m从位置(0,0)开始,从值为1开始递增;
while(m<n)
{
if(i==0){//当每次到第0行时,向右拐j+1,同时赋值m+1;每次拐弯k++,且拐弯后走k步; 注这里的if可加可不加,加了帮助理解
a[i][++j]=++m;
k++;
}
for(int x=k;m<n&&x>0;--x){//右拐后走k步,每走一步为下一行前一列位置元素赋值;
a[++i][--j]=++m;
}
if(m<n){//到了第0列,向下拐,并赋值m+1;拐弯记得k++,拐弯后走k步;此处不必判别j==0,严格执行上述过程,该步j必然等于0,故省略;
a[++i][j]=++m;
k++;
}
for(int x=k;m<n&&x>0;--x){//下拐后走k步,每走一步为上一行后一列位置元素赋值;
a[--i][++j]=++m;
}
}
for(int p=0;p<k+1;++p){//输出大矩阵中已被赋值的小矩阵中不为0的元素
for(int q=0;q<k+1;++q)
if(a[p][q]!=0)
printf("%4d",a[p][q]);
printf("\n");
}
}
int main()
{
snake_bloking();
return 0;
}
运行结果:
如果你有好思路欢迎留言讨论,文章不足之处也欢迎大家批评指正。