zigzag数组实现

本文介绍了一种使用C++编程语言生成特定Zigzag矩阵的方法,该矩阵沿45度角递增,并详细解释了上三角和下三角部分元素的计算公式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目出自面试宝典8.3.2

 

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

例如: n=2

01
23

n=3

015
246
378

n=5

015614
2471315
38121621
911172022
1018192324

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

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;
}

程序的结果为:

 

转载于:https://www.cnblogs.com/double-win/p/3641657.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值