Zig-Zag
在图形图像处理中经常须要将一个二维的图像矩阵转化为一维的向量。二维化一维的过程实际上就是将二维数组的元素按某种顺序构成一维数组。
一种经常使用的序列叫“Zig-Zag”序列。它按下面顺序将二维数组转化为一维数组:
你的任务,就是写一个程序把给定的二维数组按“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),感觉这道题出的还是不错的,不涉及什么高级算法,全然适合刚開始学习的人练习敲键盘的题,但也绝对不是看一眼立即能够写出来的。
開始看到这道题以为是类似于先前做的蛇形填数一样依照给定的顺序打印输出就可以。但细致一看。不得行。
所以又看了给定的顺序看是否有什么规律,果然是,于是就想到的排序。用排序来做感觉还是简单明了点。排序的规则是基于二维数组元素的行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;
}