zoukankan      html  css  js  c++  java
  • 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;
    }

    程序的结果为:

  • 相关阅读:
    创建用户自定义函数 SQL
    sql with as 用法
    将string转为同名类名,方法名。(c#反射)
    linq 实现对象映射
    sql 游标
    C#编程总结(六)异步编程
    线程加锁解锁,用于循环条件不确定大小
    滚动条随代码滚动
    C# 代码小技巧
    reload方法
  • 原文地址:https://www.cnblogs.com/double-win/p/3641657.html
Copyright © 2011-2022 走看看