造成一個zigzag數組(JPEG編碼裏取像素數據的排列順序)

面試例題:輸入n,求一個nXn矩陣,規定矩陣沿45度遞增,造成一個zigzag數組(JPEG編碼裏取像素數據的排列順序),請問如何用C++實現?ios

(中國臺灣著名硬件公司2007年11月面試題)(自程序員面試寶典第二版p89)程序員

程序實現以下:面試

分析:例如輸入爲8的時候獲得的zigzag數組爲:數組

造成一個zigzag數組(JPEG編碼裏取像素數據的排列順序) - 馬門dd - 但願每一個人都過的很好,都能幸福生活!
 從上面的標記的方向應該能夠看到,這個數組就是按照對角規律進行的,那麼我在寫程序的時候,會用一個兩層的for來填充這個數組。爲了從這個規律入手,咱們在考慮這個數據的填充是要理清一個思路,不要按那兩層的for循環考慮,只須要考慮第(i,j)位置與(i,j)的關係就OK了,那麼對應的填充函數就填充相應的(i,j)的函數。
 
因爲對同一斜線上的元素,s=i+j爲常數

1.對於第n個(n<N)斜線:

每一斜線個數比上一行多一個,則每一斜線的第一個值表示了在該斜線以前元素的個數,即一個累加 :

(s+1)*s/2

斜線中的任意元素可表示爲s*(s+1)/2+i

2.同理對於第n個(n>=N)的斜線:

每斜線的元素個數開始減小,等差數組不適用,爲方便起見,能夠用減法計算元素個數,

剩餘元素的斜線數目:s1=(2(N-1)-(i+j))

元素值=(N*N-(s1+1)*s1/2)-(N-i)=下一斜線的第一個元素值-該斜線剩餘元素的個數
 
程序以下:
#include <iostream>
#include <stdio.h>
using namespace std;

int main()
{
	int N;
	int s, i, j;
	int squa;
	scanf("%d", &N);
	int **a = (int **)malloc(N * sizeof(int));
	if(NULL == a)
	{
		return 0;
	}
	//空間分配
	for(i = 0; i < N; i++)
	{
		if(NULL == (a[i] = (int*)malloc(N * sizeof(int))))
		{
			while(--i >= 0)
			{
				free(a[i]);
			}
			free(a);
			return 1;
		}
	}
	squa = N * N;
	//求對應位置上應填寫的值
	for(i = 0; i < N; i++)
	{
		for(j = 0; j < N; j++)
		{ 
			s = i + j;
			
			if(s < N)//上三角
			{
				s = i + j;//爲了看的更清楚,這裏加了這條與下面對稱的語句    
				a[i][j] = s * (s + 1) / 2 + ((0 == (i + j) % 2) ? i : j);
			}
			else//下三角
			{
				s = (N - 1 - i) + (N - 1 - j);
				a[i][j] = squa - s * (s + 1) / 2 - (N - ((0 == (i + j) % 2) ? i : j));
			}
		}
	}
	//打印輸出
	for(i = 0; i < N; i ++)
	{
		for(j = 0; j < N; j++)
		{
			printf("%6d", a[i][j]);
		}
		printf("\n");
	}
	
	return 0;
}
相關文章
相關標籤/搜索