/*======================================================================
二维数组右上左下遍历
总时间限制: 1000ms 内存限制: 65536kB
描述
给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺序遍历整个数组。
OpenJudge计算概论-二维数组右上左下遍历-LMLPHP 输入
输入的第一行上有两个整数,依次为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计算概论-二维数组右上左下遍历-LMLPHPOpenJudge计算概论-二维数组右上左下遍历-LMLPHPOpenJudge计算概论-二维数组右上左下遍历-LMLPHP 上图当中,以土黄色斜排为分隔界限把矩阵分成了两个或三个部分,每一部分都需要用两重循环来完成。其中:外层循环控制斜排的层数,内层循环控制一个斜排内部的单元个数。
上三角部分斜排个数等于列数(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 ;
}

下面是一些测试案例:

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)
04-26 16:18
查看更多