生成 zigzag(JPEG编码里取像素数据的排列顺序) 样式的二维数组


 zigzag(JPEG编码里取像素数据的排列顺序)


例如:

0, 1, 5, 6,

2, 4, 7,12,

3, 8, 11,13,

9, 10, 14, 15.


(注意二维数组的使用)



#include "stdafx.h"
#include <iostream>
#include <stdio.h>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
	int N;
	int i, j;
	int s;

	scanf("%d", &N);

	int **a  = (int **)malloc(sizeof(int) * N); //N行指针--分配空间
	if(a == NULL)
		return 0;

	//给每行分配空间
	for(i = 0; i < N; i++)
	{
		if( NULL == (a[i] = (int *)malloc(sizeof(int) * N)))
		{
			//注意,分配空间失败的话,不仅仅是返回,还要释放掉之前申请的
			while(i--)
				free(a[i]);
			free(a);
			return 0; //分配空间失败,返回哦
		}
	}

	//赋值
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			s = i + j;
			if(s < N)
			{	
				a[i][j] = s * (s + 1)/2 + (s % 2 == 0 ? i : j);
			}
			else
			{
				s = (N - 1 -i) + (N - 1 - j);
				a[i][j] = N * N - s * (s + 1) / 2 - (N - ((s %2 == 0 ? i:j)));
			}
		}
	}

	//打印输出
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}


	getchar();
	getchar();
	return 0;
}




书中写:

if(s < N)
			{	
				a[i][j] = s * (s + 1)/2 + (s % 2 == 0 ? i : j);
			}
			else
			{
				s = (N - 1 -i) + (N - 1 - j);
				a[i][j] = N * N - s * (s + 1) / 2 - (N - ((s %2 == 0 ? i:j)));
			}

结果是:


这种情况是   左下角优先(小) 的情况、

你可能感兴趣的:(生成 zigzag(JPEG编码里取像素数据的排列顺序) 样式的二维数组)