蛇形数组(1)(斜向填充)(C语言版)

发布于:2022-11-28 ⋅ 阅读:(221) ⋅ 点赞:(0)

蛇形数组相关

本人第一篇CSND博客......

写的不好请见谅

 

思路

假设输入的边长为number,初始输入数字为put = 1;

首先我们先考虑分界轴以上的部分

我们定义两个变量

line : 用来控制斜线的根数

done :用来控制在当前斜线中的填充次数

我们的line从1开始,代表着是第一根斜线,通过观察,第一部分中总共有 number根斜线

所以第一部分的外层循环便是 line <= n

再观察每一根斜线所需要填充的数字次数,不难发现,次数等于line值

所以内层循环便是 done < line ,因为done初始化为零 ,所以这里没有等于号

接着是判断具体的数组坐标

当耿叔为奇数的时候,即line 为奇数 ,数字填充方向为左向右下填充

我们不考虑done的变化,奇数条的初始坐标为[0] [line-1]

考虑到外层[]是递增的,内层[]是逐步减小的

所以最终数组的坐标为[done] [line-1-done]

当根数为偶数的时候,即line为偶数,数字填充方向为右向左上填充

我们不考虑done的变化,偶数条的初始坐标为[line-1] [0]

考虑到外层[]是递减的,内层[]是逐步增大的

所以最终数组的坐标为[line-1-done] [done]

所以第一部分的代码是

for(int line = 1 ; line <= number ; line++){
        for(int done = 0 ; done < line ; done++){
            if(line % 2)
                arr[line - done -1][done] = put++;
            else
                arr[done][line-done-1] = put++;
        }
    }

接下来考虑第二部分

此时line应该为number+1 ,因为第一部分line已经为number了

整个填充过程中斜线的根数为2*number -1

所以外层循环为 line < 2*number

在第二部分中,假设斜线的根数重新开始计算,那么当line等于number-1时应该为第一根,我们设这个值为real

所以real = line - number

在观察每一根斜线所需要填充的数字次数,不难发现,次数等于number - real值

所以内层循环为(done = 0)

done < number - (line - number) done < 2*number-line

与第一部分一样

奇数初始位置为[real] [number - 1] 偶数的初始位置为 [number -1] [real]

同理

奇数的坐标为[real+done] [number -1 - done]

偶数的坐标为[number -1 - done] [real+done]

for(int line = number+1 ; line < 2* number ; line++){
        for(int done = 0 ; done < 2*number - line ; done++){
            if(line % 2)
                arr[number-done-1][line+done-number] = put++;
            else
                arr[line+done-number][number-done-1] = put++;
        }

所以总体的代码便是

#include<stdio.h>
int main()
{
    int number,put = 1;
    scanf("%d",&number);
    int arr[number][number];
    for(int line = 1 ; line <= number ; line++){
        for(int done = 0 ; done < line ; done++){
            if(line % 2)
                arr[line - done -1][done] = put++;
            else
                arr[done][line-done-1] = put++;
        }
    }
    for(int line = number+1 ; line < 2* number ; line++){
        for(int done = 0 ; done < 2*number - line ; done++){
            if(line % 2)
                arr[number-done-1][line+done-number] = put++;
            else
                arr[line+done-number][number-done-1] = put++;
        }
    }
    for(int temp = 0 ; temp < number ; temp++){
        for(int temp2 = 0 ; temp2 < number ; temp2++)
            printf("%-4d",arr[temp][temp2]);
        printf("\n");
    }
    return 0;
}
​

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到