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的问题,
毕竟分界线所在的斜排可以属于相邻的两个部分当中的任意一个。具体的请看代码和注释。)
========================================================================*/
#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计算概论-二维数组右上左下遍历的更多相关文章
- 百练6376-二维数组右上左下遍历-2015正式C题
C:二维数组右上左下遍历 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个row行col列的整数数组array,要求从array[0][0]元素开始,按从左上到右下的对角线顺 ...
- 20130330 printf数组改变 数组指针便利二维数组 二级指针遍历二维数组 ZigZag
1.为什么printf之后数组的值会改变? #include<stdio.h> ; int * Zigzag() { ,j=,limit=; ; ; int a[N][N]; int (* ...
- c/c++ 图相关的函数(二维数组法)
c/c++ 图相关的函数(二维数组法) 遍历图 插入顶点 添加顶点间的线 删除顶点 删除顶点间的线 摧毁图 取得与v顶点有连线的第一个顶点 取得与v1顶点,v1顶点之后的v2顶点的之后的有连线的第一个 ...
- JavaSE-06 二维数组
学习要点 二维数组的定义 二维数组内存数据结构 不规则二维数组 二维数组的定义 语法格式 格式一 数据类型[][] 数组名 = new 数据类型[m][n]; m:表示这个二维数组有多少个一维数组. ...
- C Tricks(十七)—— 对角线元素的屏蔽、二维数组(矩阵)的遍历
1. 对角线元素的屏蔽 使用 if + continue 实现对对角线元素的屏蔽 for u in range(n): for v in range(n): if u == v: continue . ...
- Java编程基础阶段笔记 day06 二维数组
二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 ...
- Java连载68-数组的拷贝、二维数组
一.数组的拷贝 函数arraycopy(),参数为:源数组.源数组的开始下标.目标数组.目标数组的开始下标.拷贝长度 package com.bjpowernode.java_learning; ...
- PHP导出excel文件,第二步先实现自写二维数组加入模板excel文件后导出
今天主要研究数据加入EXCEL并导出的问题,先不从数据库提取数据导出,自己先写一个二维数组,然后遍历二维数组写入excel模板中导出,首先根据模板excel的内容书写对应的二维数组 $arr=arra ...
- JAVASE(八) 数组: 一维数组、二维数组、动态数组、静态数组
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 1.一维数组 1.1 数组的声明和初始化声明方式: String str[]; //不建议使用 Stri ...
随机推荐
- jQuery轮播图
yii2 轮播 样式: <style type="text/css"> *{margin:0;padding:0} body{margin:50px} li{list- ...
- BZOJ 2083 Intelligence test
用vector,二分. #include<iostream> #include<cstdio> #include<cstring> #include<algo ...
- 转载大神的dfs讲解
http://acm.hdu.edu.cn/forum/read.php?tid=6158 看完明白了好多! 关于剪枝,没有剪枝的搜索不太可能,这题老刘上课的时候讲过两个剪枝,一个是奇偶剪枝,一个是路 ...
- HDU5441 Travel 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=5441 无向图,n个点,m条带权边,q次询问,给出数值d,点a可以到点b当且仅当存在一条路线其中最大的权值不超过d ...
- Response响应请求操作
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Te ...
- 编程之美的2.17,数组循环移位 & 字符串逆转(反转) Hello world Welcome => Welcome world Hello
代码如下:(类似于编程之美的2.17,数组循环移位) static void Main(string[] args) { string input = "Hello World Welcom ...
- System.out.println调试输出
Android开发中在代码中通过System.out.println调试输出在Logcat窗口中可以看到. 但Logcat视图中夹杂了太多的其它App及底层的信息,看起来并不明朗.可以在Logcat视 ...
- mark资料-selenium断言的分类
操作(action).辅助(accessors)和断言(assertion): 操作action: 模拟用户与 Web 应用程序的交互. 辅助accessors: 这是辅助工具.用于检查应用程序的状态 ...
- Java-->类的成员
一.方法重载 在同一个类中,方法名相同.形参列表不同的两个多个方法之间构成重载!overload 调用方法的时候,是根据你传递的实参,来决定到底调用的是重载的哪个方法!!! 注意: 1.判断形参列表是 ...
- hive-jdbc/odbc的解读和看法
当前的项目中, 涉及到了hive-jdbc/odbc这块, 因此把这几天所调研的资料作一份总结.本文讲解hive-jdbc/hive-odbc的实现, 以期对jdbc/odbc规范和实现有个较深入的理 ...
输入

上图当中,以土黄色斜排为分隔界限把矩阵分成了两个或三个部分,每一部分都需要用两重循环来完成。其中:外层循环控制斜排的层数,内层循环控制一个斜排内部的单元个数。