OpenJudge计算概论-二维数组右上左下遍历

简介: /*====================================================================== 二维数组右上左下遍历 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
/*======================================================================
二维数组右上左下遍历
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个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
样例输出
1
2
3
4
5
6
7
8
9
10
11
12


解析:这个题目需要分情况讨论行数和列数的大小关系,不同情况不同的处理方式。



上图当中,以土黄色斜排为分隔界限把矩阵分成了两个或三个部分,每一部分都需要用两重循环来完成。其中:外层循环控制斜排的层数,内层循环控制一个斜排内部的单元个数。
上三角部分斜排个数等于列数(row>col)或行数(row<col),下三角部分斜排的个数等于列数
(row>col)或行数(row<col)(当然,其中有些部分需要注意多1或少1的问题,
毕竟分界线所在的斜排可以属于相邻的两个部分当中的任意一个。具体的请看代码和注释。)
========================================================================*/
  1 #include<stdio.h>
  2 int main()
  3 {
  4     int row,col,a[100][100],i,j,x,y,t;
  5     freopen("55555.in","r",stdin);
  6     freopen("result.out","w",stdout);
  7     scanf("%d%d",&row,&col);
  8     for(i=0;i<row;i++)
  9     {
 10         for(j=0;j<col;j++)
 11         {
 12             scanf("%d",&a[i][j]);
 13         }
 14     }
 15     /*for(i=0;i<row;i++)
 16     {
 17         for(j=0;j<col;j++)
 18         {
 19             printf("%d ",a[i][j]);
 20         }
 21         printf("\n");
 22     }*/
 23     /**/
 24     if(row>col)
 25     {
 26         t=col;//斜排数量 
 27         for(j=0;j<t;j++)//循环处理每一个斜排 
 28         {
 29             y=j;//每个斜排第一个单元的纵坐标 
 30             x=0;//每个斜排第一个单元的横坐标 
 31             for(i=0;i<=j;i++,x++,y--)//i控制每个斜排内部单元的个数 
 32             {
 33                 printf("%d\n",a[x][y]);
 34             }
 35         }
 36         
 37         t=row-col;
 38         for(j=1;j<=t;j++)
 39         {
 40             y=col-1;
 41             x=j;
 42             for(i=1;i<=col;i++,x++,y--)
 43             {
 44                 printf("%d\n",a[x][y]);
 45             }
 46         }
 47         
 48         t=col-1;
 49         for(j=t;j>0;j--)
 50         {
 51             y=col-1;
 52             x=row-j;
 53             for(i=0;i<j;i++,x++,y--)
 54             {
 55                 printf("%d\n",a[x][y]);
 56             }
 57         }
 58     }
 59     else if(row<col)
 60     {
 61         t=row;
 62         for(i=1;i<=t;i++)
 63         {
 64             x=0;
 65             y=i-1;
 66             for(j=1;j<=i;j++,x++,y--)
 67             {
 68                 printf("%d\n",a[x][y]);
 69             }
 70         }
 71         
 72         t=col-row;
 73         for(i=1;i<=t;i++)
 74         {
 75             x=0;
 76             y=row+i-1;
 77             for(j=1;j<=row;j++,x++,y--)
 78             {
 79                 printf("%d\n",a[x][y]);
 80             }
 81         }
 82         
 83         t=row-1;
 84         for(i=t;i>0;i--)
 85         {
 86             x=row-i;
 87             y=col-1;
 88             for(j=1;j<=i;j++,x++,y--)
 89             {
 90                 printf("%d\n",a[x][y]);
 91             }
 92         }
 93     }
 94     else
 95     {
 96         t=row;
 97         for(i=1;i<=t;i++)
 98         {
 99             x=0;
100             y=i-1;
101             for(j=1;j<=i;j++,x++,y--)
102             {
103                 printf("%d\n",a[x][y]);
104             }
105         }
106         
107         t=row-1;
108         for(i=t;i>0;i--)
109         {
110             x=row-i;
111             y=col-1;
112             for(j=1;j<=i;j++,x++,y--)
113             {
114                 printf("%d\n",a[x][y]);
115             }
116         }
117     }
118     
119     
120     return 0;
121 }

 

下面是一些测试案例:

1 2 4 7 11 16 22
3 5 8 12 17 23 29
6 9 13 18 24 30 36
10 14 19 25 31 37 43
15 20 26 32 38 44 50
21 27 33 39 45 51 57
28 34 40 46 52 58 64
35 41 47 53 59 65 71
42 48 54 60 66 72 78
49 55 61 67 73 79 85
56 62 68 74 80 86 92
63 69 75 81 87 93 99
70 76 82 88 94 100 105
77 83 89 95 101 106 110
84 90 96 102 107 111 114
91 97 103 108 112 115 117
98 104 109 113 116 118 119

 

1 2 4 7 11 16 22 28 34 40 46 52 58 64 70
3 5 8 12 17 23 29 35 41 47 53 59 65 71 76
6 9 13 18 24 30 36 42 48 54 60 66 72 77 81
10 14 19 25 31 37 43 49 55 61 67 73 78 82 85
15 20 26 32 38 44 50 56 62 68 74 79 83 86 88
21 27 33 39 45 51 57 63 69 75 80 84 87 89 90

 

1 2 4
3 5 7
6 8 10
9 11 12

 

1 2 4 7
3 5 8 11
6 9 12 14
10 13 15 16

 

 这个其实可以考虑把上面的这么多次相类似的代码写成子函数。

 

 

(row<col)
相关文章
【C++百日刷题计划】Day2~数组的使用(请编程计算下列给出的二维数组周边元素之和)
【C++百日刷题计划】Day2~数组的使用(请编程计算下列给出的二维数组周边元素之和)
140 0
|
存储 人工智能
Openjudge计算概论——数组逆序重放【递归练习】
/*===================================== 数组逆序重放 总时间限制:1000ms 内存限制:65536kB 描述 将一个数组中的值按逆序重新存放。
988 0
|
人工智能 算法
OpenJudge计算概论-字符串排序
/*====================================================================== 字符串排序 总时间限制: 1000ms 内存限制: 65536kB 描述 参考整数排序方法,设计一种为字符串排序的算法,将字符串从小到大输出 输入 第一行为测试数据组数t, 后面跟着t组数据。
798 0
OpenJudge计算概论-字符串最大跨距
/*====================================================================== 字符串最大跨距 总时间限制: 1000ms 内存限制: 65536kB 描述 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10,想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在 S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。
1329 0
|
存储 人工智能 算法
Openjudge计算概论-求序列中的众数
/*===================================== 求序列中的众数 总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个长度为N的整数序列 (不多于128个整数),每个整数的范围在[-10^52,10^52],计算这个序列的众数。
1007 0
|
机器学习/深度学习 人工智能
OpenJudge计算概论-矩阵归零消减序列和
矩阵归零消减序列和 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个n*n的矩阵(3 1;x--) 24 { 25 //行的归零 26 for(i=0;i
1062 0
|
人工智能
Openjudge计算概论-奇数单增序列
/*===================================== 奇数单增序列 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个长度为N(不大于500)的正整数序列,请将其中的所有奇数取出,并按增序输出。
1097 0
|
存储 人工智能
OpenJudge计算概论-找最大数序列
/*===================================== 找最大数序列 总时间限制: 1000ms 内存限制: 65536kB 描述 输入n行(n 不大于 30),每行不超过100个无符号整数,无符号数不超过4位。
1275 0
|
人工智能
OpenJudge计算概论-整数奇偶排序
/*===================================== 整数奇偶排序 总时间限制: 1000ms 内存限制: 65536kB 描述 输入10个整数,彼此以空格分隔 重新排序以后输出(也按空格分隔),要求: 1.先输出其中的奇数,并按从大到小排列; 2.然后输出其中的偶数,并按从小到大排列。
1035 0
OpenJudge计算概论-求出e的值
/*======================================================================== 求出e的值 总时间限制: 1000ms 内存限制: 65536kB 描述 利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e 。
872 0