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

时间:2024-06-06 23:35:20
/*======================================================================
二维数组右上左下遍历
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
OpenJudge计算概论-二维数组右上左下遍历 输入
输入的第一行上有两个整数,依次为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 解析:这个题目需要分情况讨论行数和列数的大小关系,不同情况不同的处理方式。
OpenJudge计算概论-二维数组右上左下遍历OpenJudge计算概论-二维数组右上左下遍历OpenJudge计算概论-二维数组右上左下遍历 上图当中,以土黄色斜排为分隔界限把矩阵分成了两个或三个部分,每一部分都需要用两重循环来完成。其中:外层循环控制斜排的层数,内层循环控制一个斜排内部的单元个数。
上三角部分斜排个数等于列数(row>col)或行数(row<col),下三角部分斜排的个数等于列数(row>col)或行数(row<col)(当然,其中有些部分需要注意多1或少1的问题,
毕竟分界线所在的斜排可以属于相邻的两个部分当中的任意一个。具体的请看代码和注释。)
========================================================================*/
 #include<stdio.h>
int main()
{
int row,col,a[][],i,j,x,y,t;
freopen("55555.in","r",stdin);
freopen("result.out","w",stdout);
scanf("%d%d",&row,&col);
for(i=;i<row;i++)
{
for(j=;j<col;j++)
{
scanf("%d",&a[i][j]);
}
}
/*for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");
}*/
/**/
if(row>col)
{
t=col;//斜排数量
for(j=;j<t;j++)//循环处理每一个斜排
{
y=j;//每个斜排第一个单元的纵坐标
x=;//每个斜排第一个单元的横坐标
for(i=;i<=j;i++,x++,y--)//i控制每个斜排内部单元的个数
{
printf("%d\n",a[x][y]);
}
} t=row-col;
for(j=;j<=t;j++)
{
y=col-;
x=j;
for(i=;i<=col;i++,x++,y--)
{
printf("%d\n",a[x][y]);
}
} t=col-;
for(j=t;j>;j--)
{
y=col-;
x=row-j;
for(i=;i<j;i++,x++,y--)
{
printf("%d\n",a[x][y]);
}
}
}
else if(row<col)
{
t=row;
for(i=;i<=t;i++)
{
x=;
y=i-;
for(j=;j<=i;j++,x++,y--)
{
printf("%d\n",a[x][y]);
}
} t=col-row;
for(i=;i<=t;i++)
{
x=;
y=row+i-;
for(j=;j<=row;j++,x++,y--)
{
printf("%d\n",a[x][y]);
}
} t=row-;
for(i=t;i>;i--)
{
x=row-i;
y=col-;
for(j=;j<=i;j++,x++,y--)
{
printf("%d\n",a[x][y]);
}
}
}
else
{
t=row;
for(i=;i<=t;i++)
{
x=;
y=i-;
for(j=;j<=i;j++,x++,y--)
{
printf("%d\n",a[x][y]);
}
} t=row-;
for(i=t;i>;i--)
{
x=row-i;
y=col-;
for(j=;j<=i;j++,x++,y--)
{
printf("%d\n",a[x][y]);
}
}
} return ;
}

下面是一些测试案例:

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)