蛇形填充数组

简介: http://noi.openjudge.cn/ch0108/24/ 总时间限制: 1000ms 内存限制: 65536kB描述 用数字1,2,3,4,...,n*n这n2个数蛇形填充规模为n*n的方阵。

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("\n");
73     }
74     return 0;
75 }

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

 

相关文章
|
7月前
|
算法 前端开发
100224. 分割数组
100224. 分割数组
45 0
|
7月前
|
Java
【每日一题Day121】LC1139最大的以 1 为边界的正方形 | 前缀和数组 + 枚举
【每日一题Day121】LC1139最大的以 1 为边界的正方形 | 前缀和数组 + 枚举
44 0
|
4月前
|
算法
如何反转给定的字符串?
【8月更文挑战第23天】
51 0
|
7月前
|
存储 Java API
Java数组元素的填充与替换技术详解
Java数组元素的填充与替换技术详解
72 1
|
7月前
数组的形状
【5月更文挑战第6天】数组的形状。
42 1
|
7月前
|
人工智能 算法 数据可视化
【算法训练-数组 五】【数组组合】:下一个排列
【算法训练-数组 五】【数组组合】:下一个排列
56 0
|
JSON 数据格式
将字符串按指定的符号分割为集合或数组
将字符串按指定的符号分割为集合或数组
199 0
将字符串按指定的符号分割为集合或数组
|
Python
用python实现字符串填充
填充是用指定的字符对字符串进行填满指定的长度;就是补差价;
291 0
用python实现字符串填充
LeetCode 06Z字形变换&07整数反转
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
123 0
LeetCode 06Z字形变换&07整数反转
下一篇
DataWorks