/*======================================================================
二维数组右上左下遍历
总时间限制: 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的问题,
毕竟分界线所在的斜排可以属于相邻的两个部分当中的任意一个。具体的请看代码和注释。)
========================================================================*/
 #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)

OpenJudge计算概论-二维数组右上左下遍历的更多相关文章

  1. 百练6376-二维数组右上左下遍历-2015正式C题

    C:二维数组右上左下遍历 总时间限制:  1000ms 内存限制:  65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺 ...

  2. 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag

    1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...

  3. c/c++ 图相关的函数(二维数组法)

    c/c++ 图相关的函数(二维数组法) 遍历图 插入顶点 添加顶点间的线 删除顶点 删除顶点间的线 摧毁图 取得与v顶点有连线的第一个顶点 取得与v1顶点,v1顶点之后的v2顶点的之后的有连线的第一个 ...

  4. JavaSE-06 二维数组

    学习要点 二维数组的定义 二维数组内存数据结构 不规则二维数组 二维数组的定义 语法格式 格式一 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. ...

  5. C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历

    1. 对角线元素的屏蔽 使用 if + continue 实现对对角线元素的屏蔽 for u in range(n): for v in range(n): if u == v: continue . ...

  6. Java编程基础阶段笔记 day06 二维数组

    二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...

  7. Java连载68-数组的拷贝、二维数组

    一.数组的拷贝 函数arraycopy(),参数为:源数组.源数组的开始下标.目标数组.目标数组的开始下标.拷贝长度 package com.bjpowernode.java_learning; ​ ...

  8. PHP导出excel文件,第二步先实现自写二维数组加入模板excel文件后导出

    今天主要研究数据加入EXCEL并导出的问题,先不从数据库提取数据导出,自己先写一个二维数组,然后遍历二维数组写入excel模板中导出,首先根据模板excel的内容书写对应的二维数组 $arr=arra ...

  9. JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 Stri ...

随机推荐

  1. Get start with Android development

    Firstly we should install the right version of JDK and JRE, there are two version of ADK for differe ...

  2. Planning for a period of time

    After a period of struggle , i decided to follow the teacher Chen learning . Say true i really disli ...

  3. 想调试,装了个Zend Server

    本来apache+mysql+php+zend studio+ svn + ftp +ssh跑的挺好,总想跑个断点调个程序能爽些,白瞎这么强的GUI集成开发环境,只能System.out.printl ...

  4. Svn win7系统下状态图标不显示-转载

    Svn win7系统下状态图标不显示 Svn版本 tortoisesvn-1.8.8.25755-x64-svn-1.8.10.msi 2.不显示图标状态如图1,期望结果显示图标状态如图2 图1 图2 ...

  5. 在Linux下用fdisk创建分区

    一.输入 fdisk -l /dev/sda ,观察硬盘之实体使用情形.二.输入 fdisk /dev/sda,可进入分割硬盘模式. 1. 输入 m 显示所有命令列示. 2. 输入 p 显示硬盘分割情 ...

  6. Android布局居中的几种做法

    Android的布局文件中,如果想让一个组件(布局或View)居中显示在另一个布局(组件)中,可以由这么几种做法: android:layout_gravity android:gravity and ...

  7. 5、SQL基础整理(字符串函数)

    字符串函数 ASCII 返回字符串首字母的ascii编码 select ASCII('name') select ASCII(name) from xuesheng select *from xues ...

  8. WCF之多个协定

    多个协定”示例演示如何在一个服务上实现多个协定,以及如何配置终结点以便与实现的每个协定进行通信 1.服务端代码如下(服务实现了两个协定,增加了黄色所示代码): class Program { stat ...

  9. php计算一天的时间

    代码如下: $time=time(); //一天的开始 $start=strtotime(date('Y-m-d',$time).'00:00:01'); echo date('Y-m-d H:i:s ...

  10. Apache、tomcat、Nginx常用配置合集

    配置文件地址: Apache: /etc/httpd/conf/httpd.conf tomcat: /usr/local/tomcat/conf/server.xml Nginx  : /usr/l ...