zigzag数组实现

题目出自面试宝典8.3.2

 

题目描述: 输入n,求一个n*n的矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里去像素数据的排列顺序),请问如何用C++实现?

例如: n=2

0 1
2 3

n=3

0 1 5
2 4 6
3 7 8

n=5

0 1 5 6 14
2 4 7 13 15
3 8 12 16 21
9 11 17 20 22
10 18 19 23 24

分析每个矩阵中上三角矩阵,可以看到上三角矩阵的元素都满足:

s= i+j;

a[i][j] = s*(s+1)/2 +( (s%2==0)?i:j);

 

此外,下三角的矩阵的每个元素满足 a[i][j] + a[n-1-i][n-1-j] = N-1;

根据上面的分析,可以得到如下的程序:

#include <iostream>
using namespace std;
int a[100][100]={0};

void draw(int n)
{
    int i,j,s,N=n*n;
    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)?j:i); 
          }
          else  //下三角矩阵
          {
              s= (n-1 -i) +(n-1 -j);
              a[i][j] = N - s*(s+1)/2 + (((s%2==0)?j:i))-n;
          }
       }
    }
    for(i=0;i<n;i++)
    {
       for(int j=0;j<n;j++)
       {
          cout<<a[i][j]<<" ";
       }
       cout<<endl;
    }
}

int main()
{
    int n;
    while(cin>>n)
    {
       draw(n);
    }
    return 0;
}

程序的结果为:

 

posted @ 2014-04-02 21:40  Double_win  阅读(488)  评论(0编辑  收藏  举报