SOJ--Zig-Zag 叁歲伎倆 2022-08-13 12:45 103阅读 0赞 **Zig-Zag** 在图形图像处理中常常需要将一个二维的图像矩阵转化为一维的向量。二维化一维的过程实际上就是将二维数组的元素按某种顺序构成一维数组。一种常用的序列叫“Zig-Zag”序列,它按以下顺序将二维数组转化为一维数组: ![zig-zag.gif][] 你的任务,就是写一个程序把给定的二维数组按“Zig-Zag”顺序转化为一维数组。 本题中所有的二维数组都是正方形的(即行数等于列数)。 ## 输入 ## 输入有多组测试数据,每组测试数据的第一行为一个整数n(1<=n<=50),表示二维数组的边长。接下来是要转换的二维数组的数据,有n行,每行有n个整数(各整数的大小在1到100之间),各行中的整数之间用一个空格分隔。 输入的n为0表示输入结束,这一行不需要处理。 ## 输出 ## 对于每组测试数据,输出一行,即按“Zig-Zag”顺序转换得到的一维数组,数组中的数之间用一个空格分隔。 ## 输入示例 ## 2 1 2 3 4 3 1 2 3 4 5 6 7 8 9 0 ## 输出示例 ## 1 2 3 4 1 2 4 7 5 3 6 8 9 -------------------- 解析:今天在川大OJ做了个练习题([http://cstest.scu.edu.cn/soj/contest/problem.action?cid=350&alias=D][http_cstest.scu.edu.cn_soj_contest_problem.action_cid_350_alias_D]),感觉这道题出的还是不错的,不涉及什么高级算法,完全适合初学者练习敲键盘的题,但也绝对不是看一眼马上可以写出来的。开始看到这道题以为是类似于先前做的蛇形填数一样按照给定的顺序打印输出即可,但仔细一看,不得行。所以又看了给定的顺序看是否有什么规律,果然是,于是就想到的排序,用排序来做感觉还是简单明了点。排序的规则是基于二维数组元素的行i+列j的和为基准的。 1.首先打印i+j较小的二维数组元素 2.如果i+j相同的,判断i+j的奇偶性,如果i+j为偶数 则按j的大小增序排列反之按照j降序排列即可。 贴一些自己的代码(总体来看感觉自己写的代码还是太乱。。。) #include <iostream> #include <algorithm> using namespace std; //定义元素的结构体,方便排序 struct Elem{ int data; int i; int j; }; //自定义排序算法 bool cmp(const Elem a , const Elem b) { //首先按行+列的和进行递增排序 if( (a.i+a.j) < (b.i+b.j) ) return true; else if((a.i+a.j)==(b.i+b.j) && (a.i+a.j)%2==0 && a.i > b.i) return true; else if((a.i+a.j)==(b.i+b.j) && (a.i+a.j)%2!=0 && a.i < b.i) return true; else return false; } int main() { Elem a[2501]; int n,data; while(cin >> n) { int m=0; //终止条件 if(n==0) break; //输入二维数组元素转换为自定义的结构体来存储 for(int i=0;i<n;++i) for(int j=0;j<n;++j) { cin >> data; a[m].data=data; a[m].i=i; a[m++].j=j; } //按照cmp排序规则进行排序 sort(a,a+m,cmp); //输出元素 for(int i=0;i<n*n;++i) cout << a[i].data << " "; cout << endl; } return 0; } [zig-zag.gif]: http://cstest.scu.edu.cn/soj/contest/problem/350/D/zig-zag.gif [http_cstest.scu.edu.cn_soj_contest_problem.action_cid_350_alias_D]: http://cstest.scu.edu.cn/soj/contest/problem.action?cid=350&alias=D
还没有评论,来说两句吧...