【模拟】蛇形填充数组

蛇形填充数组

用数字1,2,3,4,...,n*nn2个数蛇形填充规模为n*n的方阵

蛇形填充方法为

对于每一条左下-右上的斜线从左上到右下依次编号1,2,...,2n-1;按编号从小到大的顺序将数字从小到大填入各条斜线其中编号为奇数的从左下向右上填写编号为偶数的从右上到左下填写

比如n=4方阵填充为如下形式

 

 输入输出格式 Input/output

输入格式
输入一个不大于10的正整数n,表示方阵的行数.
输出格式
输出该方阵相邻两个元素之间用单个空格间隔

 输入输出样例 Sample input/output

样例测试点#1

输入样例

4

输出样例

1 2 6 7

3 5 8 13

4 9 12 14

10 11 15 16

 

思路我先以一个5*5的例子开头吧如下图所示是一个已经填充好的蛇形数组

 

图中的kk根红线代表有kk次循环,kk=2*n-1

 每次按照红线的箭头来存放数字对于循环的次数i来说如果i是单数则数字存放是由左下往右上如果i是双数则数字存放是由右上往左下

这里要分两种情况来讨论

  <1>:当循环是下图中的部分时每次循环的次数都会递增1,第一次循环是从1开始第二次循环是2、3,第三次循环是4、5、6

那么对于每次循环的开始和止点通过观察都可以得出一个普遍结论i是奇数时循环次数为i,a[i-j][j]就可以递增i是偶数循环次数还是i,a[j][i-j],也是递增

  <2>:当循环是下图中的部分时每次循环的次数也是递增1,第一次循环是16、17、18、19,第二次循环是20、21、22,以此类推每次需要循环的次数都是递减的这时候循环的次数和循环的起止点都不和i<=n时一样了这时候就需要重新寻找规律我在这里定义了一个k来计算循环到达的层数例如16、17、18、19这是第一层这样就可以很方便地用kn来控制循环次数我得出了一个普遍公式:j0开始一直到n-k循环如果i是奇数则每次递增a[i-j-k][j+k],如果i是偶数则每次递增a[j+k][i-j-k]即可

 

 

 

 

 

代码如下

#include <stdio.h>

int main()

{

    int n,i,j;

    int kk;

    int o=1;//用来改变数组的变量 

    int k=1;

    int a[101][101];

    scanf("%d",&n);

    kk=2*n-1;//控制总循环次数 

    for(i=0;i<=kk;i++)

    {

        /*===========================*///①部分

        if(i%2==0&&i<n)//递增

        {

            for(j=0;j<=i;j++)

            {

                a[i-j][j]=o;

                o++;

            }

        }

        else if(i%2==1&&i<n)//递减 

        {

            for(j=0;j<=i;j++)

            {

                a[j][i-j]=o;

                o++;

            }

        }

        /*===========================*///②部分

        else if(i%2==0&&i>=n)//递增 

        {

            for(j=0;j<n-k;j++)

            {

                a[i-j-k][j+k]=o;

                o++;

            }

            k++;

        }

        else if(i%2==1&&i>=n)//递减 

        {

            for(j=0;j<n-k;j++)

            {

                a[j+k][i-j-k]=o;

                o++;

            }

            k++;

        }

    }

    for(i=0;i<n;i++)//输出结果 

    {

        for(j=0;j<n;j++)

        {

            printf("%d ",a[i][j]);

        }

        printf("\n");

    }

    return 0;

}

猜你喜欢

转载自blog.csdn.net/u011590573/article/details/80031110
今日推荐