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

/*======================================================================
二维数组右上左下遍历
总时间限制: 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 }

 

下面是一些测试案例:

1247111622
35812172329
691318243036
10141925313743
15202632384450
21273339455157
28344046525864
35414753596571
42485460667278
49556167737985
56626874808692
63697581879399
7076828894100105
77838995101106110
849096102107111114
9197103108112115117
98104109113116118119

 

12471116222834404652586470
358121723293541475359657176
6913182430364248546066727781
101419253137434955616773788285
152026323844505662687479838688
212733394551576369758084878990

 

124
357
6810
91112

 

1247
35811
691214
10131516

 

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

 

 

(row<col)

转载于:https://www.cnblogs.com/huashanqingzhu/p/3477717.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值