蛇形填充数组

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来控制就好了。不过我是懒得改写了呵呵)

时间: 2024-08-02 19:40:46

蛇形填充数组的相关文章

24:蛇形填充数组

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

#2019120700022 蛇形填充数组

\(Way1\) #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int a[21][21]; int n; int main(){ memset(a,0,sizeof(a)); scanf("%d",&n); int x=1,y=n; a[x][y]=1;//一定要赋初值 int now

随机生成数字填充数组

随机生成10个数,填充一个数组,然后用消息框显示数组内容,接着计算数组元素的和,将结果也显示在消息框中. 设计思路: 1.创建一个数组array[],长度为10. 2.在for循环中调用Math.Random()方法随机生成一定范围内的整数. 3.调用JOptionPane.showMessageDialog()方法将数组元素输出. 4.用for循环将数组元素相加,然后同步骤3. 程序流程图: 源程序代码: //随机生成10个数,填充一个数组,用消息框显示数组内容, //接着计算数组元素的和,将

蛇形填充

1 //局限性:只能实现1-10的功能 2 #include <iostream> 3 #include <string.h> 4 using namespace std; 5 #define MAXN 10 6 int a[MAXN][MAXN]; 7 8 int main(){ 9 int n,x,y,tot=0; 10 cin>>n; 11 memset(a,0,sizeof(a));//将已开辟内存空间a的首sizeof(a)个字节的值设为值0. 12 //函数

array_fill 用给定的值填充数组

转自:http://www.phpstudy.net/php/165.html PHP array_fill 用给定的值填充数组 array_fill (PHP 4 >= 4.2.0, PHP 5) array_fill — 用给定的值填充数组 说明 array array_fill ( int $start_index , int $num , mixed $value ) array_fill() 用 value 参数的值将一个数组填充 num 个条目,键名由 start_index 参数指

用array_merge填充数组数据

工作中遇到一需求,要求传送一个数组给js画图 数组的key是日期,value是当天的值 问题是从数据库取出来的值有些日期是没有的,需要给这里没有的日期补上值0 这个时候就可以先创建一个数组,key是所需要的日期,value都是0 例如 $dateArray=array("2014-01-01"=>0,"2014-01-02"=>0,"2014-01-03"=>0,"2014-01-04"=>0,&quo

js-03课 -04 自动填充数组

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> alert(fn1(5)) //1 2 3 4 5 function fn1(n){ if(!isDigital(n)){ alert("请输入正

array_fill 填充数组内容

<?php $a = array_fill(5, 6, 'banana'); $b = array_fill(-2, 4, 'pear'); print_r($a); print_r($b) Array ( [5] => banana [6] => banana [7] => banana [8] => banana [9] => banana [10] => banana ) Array ( [-2] => pear [0] => pear [1]

noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T21——T25

T21 二维数组右上左下遍历 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组. 输入 输入的第一行上有两个整数,依次为row和col.余下有row行,每行包含col个整数,构成一个二维整数数组.(注:输入的row和col保证0 < row < 100, 0 < col < 100) 输出 按遍历顺序输出每个整数.每个整数占一行. 样例输入 3 4 1 2 4 7 3 5 8 10 6 9 11 12