• 蛇形填充数组


    http://noi.openjudge.cn/ch0108/24/

    总时间限制: 
    1000ms
     
    内存限制: 
    65536kB
    描述

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

    蛇形填充方法为:

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

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

    1  2  6  7
    3  5  8  13
    4  9  12 14
    10 11 15 16
    
    输入
    输入一个不大于10的正整数n,表示方阵的行数。
    输出
    输出该方阵,相邻两个元素之间用单个空格间隔。
    样例输入
    4
    样例输出
    1 2 6 7
    3 5 8 13
    4 9 12 14
    10 11 15 16

    分析:这个题目要注意看输入输出案例当中蛇形数组的排列顺序,按题目的意思来操作。

    这里把方阵分成左上三角(包括主对角线)和右下三角两个部分分别处理。

    上三角部分斜排数等于n,为了便于处理,斜排序列k从0~(n-1)。

    下三角部分斜排数是n-1,斜排序列k从1到n-1.

    对上三角而已,k为偶数时,斜排从小网上走;当k为奇数时刚好相反。

    但是要注意:下三角斜排的方向不能这样确定。当n的奇偶性不同的时候,上三角末尾斜排的方向也不一样,导致了下三角起始斜排的方向不同。这里用一个flag变量来标识下三角起始斜排的方向。

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 int main(int argc, char *argv[])
     4 {
     5     int n,i,j,t;
     6     int **a;
     7     int k;
     8     int flag;
     9     
    10     scanf("%d",&n);
    11     a=(int **)malloc(sizeof(int*)*n);
    12     for(i=0;i<n;i++) a[i]=(int *)malloc(sizeof(int)*n);
    13     
    14     t=0;
    15     for(k=0;k<n;k++)//填充左上三角部分(包括主对角线) 
    16     {
    17         if((k&1)==0)//第奇数个斜排,从左下往右上扫描填充 
    18         {
    19             i=k;
    20             j=0;
    21             for(;i>=0;i--,j++)
    22             {
    23                 t++;
    24                 a[i][j]=t;
    25             }
    26         }
    27         else//第偶数个斜排,从右上往左下扫描填充 
    28         {
    29             i=0;
    30             j=k;
    31             for(;j>=0;i++,j--)
    32             {
    33                 t++;
    34                 a[i][j]=t;
    35             }
    36         }
    37     }
    38     
    39     if((n&1)==0) //flag等于0或1决定了右下三角部分第一个斜排的方向 
    40         flag=1;
    41     else flag=0;
    42     for(k=1;k<n;k++)//右下三角部分(不包括主对角线) 
    43     {
    44         if(flag==1)//从左下往右上扫描填充 
    45         {
    46             i=n-1;
    47             j=k;
    48             for(;j<n;j++,i--)
    49             {
    50                 t++;
    51                 a[i][j]=t;
    52             }
    53             flag=0; 
    54         }
    55         else//从右上往左下扫描填充 
    56         {
    57             i=k;
    58             j=n-1;
    59             for(;i<n;i++,j--)
    60             {
    61                 t++;
    62                 a[i][j]=t;
    63             }
    64             flag=1;
    65         }
    66     }
    67     
    68     for(i=0;i<n;i++)
    69     {
    70         for(j=0;j<n;j++)
    71             printf("%d ",a[i][j]);
    72         printf("
    ");
    73     }
    74     return 0;
    75 }

     其实,可以完全由flag变量控制上三角和下三角各个斜排的方向。(也就是说上三角部分的斜排也用flag来控制就好了。不过我是懒得改写了呵呵)

  • 相关阅读:
    计算机基础知识
    看 C++ Primer 的58页, 讲拷贝时不能忽略 底层const这里的说的原因有点牵强, 这里给出自己的理解
    GitHub
    让 typora和word一样好用
    推荐几款好用的文本编辑器,让您的办公更方便快捷。
    UML类图几种关系的总结
    poll, ppoll
    信号之sigaction函数
    posix多线程有感--自旋锁
    Linux IPC
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/5668149.html
Copyright © 2020-2023  润新知