• ZigZag数组的C++实现程序员面试宝典读书笔记(一)


      1 // 一道有趣的面试题.cpp : 定义控制台应用程序的入口点。
      2 
      3 /*************************************************
      4    设计者:cslave
      5    版本说明:本代码免费用于商用,拷贝,转移,使用,但是
      6    有本代码导致的问题,本人概不负责。
      7    设计时间:2012.7.10
      8    分发原则:遵守GNU规范。
      9  **************************************************/
     10 /**************************************************
     11 
     12 题目:输入n 求一个n*n的矩阵,规定矩阵沿45度角线递增,
     13 形成一个zigzag数组,请问如何用C++实现
     14 如图:
     15 
     16 Please Input The Number!
     17 8
     18      0     1     5     6    14    15    27    28
     19      2     4     7    13    16    26    29    42
     20      3     8    12    17    25    30    41    43
     21      9    11    18    24    31    40    44    53
     22     10    19    23    32    39    45    52    54
     23     20    22    33    38    46    51    55    60
     24     21    34    37    47    50    56    59    61
     25     35    36    48    49    57    58    62    63
     26 
     27 
     28 分析:
     29 先看矩阵,发现矩阵对角线上部元素与下部对应元素之和为N^2-1
     30 即为 Arr[i][j]+Arr[N-1-i][N-1-j]=N^2-1
     31 
     32 所以我们只需要处理上三角即可,下三角可推出。
     33 观察上三角中。
     34 数组各项横纵坐标与值的关系
     35 0  0  0
     36 0  1  1
     37 1  0  2
     38 2  0  3
     39 1  1  4
     40 0  2  5
     41 0  3  6
     42 1  2  7
     43 2  1  8
     44 3  0  9
     45 4  0  10
     46 从中分析 发现(i+j)的和与结果有关系
     47 令 s=i+j
     48 s=0  只有0 1个元素落在这个范围
     49 s=1  有2个
     50 s=2  有3个
     51 s=3  有4个
     52 s=4  。。。
     53 这样 
     54 任意一项Arr[i][j],令s=i+j
     55 则该项之前的s-1项有
     56 1+2+...+s=s(s+1)/2这么多个数,那么该数位于哪个位置?
     57 我们再看看 添加其前s-1项的和
     58 0  0  0   0
     59 0  1  1   1
     60 1  0  2   1
     61 2  0  3   3
     62 1  1  4   3
     63 0  2  5   3
     64 0  3  6   6
     65 1  2  7   6
     66 2  1  8   6
     67 3  0  9   6
     68 4  0  10  10
     69 从中我们可以看出 ,当s能够被2整除时 Arr[i][j]=s(s+1)/2+j
     70 否则 Arr[i][j]=s(s+1)/2+i;
     71 
     72 ****************************************************/
     73 
     74 
     75 
     76 #include "stdafx.h"
     77 #include <iostream>
     78 #include <iomanip>
     79 using namespace std;
     80 
     81 int _tmain(int argc, _TCHAR* argv[])
     82 {
     83     int N;
     84     int s,i,j;
     85     cout<<"Please Input The Number!"<<endl;
     86     cin>>N;
     87     int** Arr=new int*[N];//int** Arr=(int **)malloc(N*sizeof(int));
     88     for(i=0;i<N;i++)
     89         Arr[i]=new int[N];//Arr[i]=(int*)malloc(N*sizeof(int));严格来讲这里应该加强防错处理。
     90     for(i=0;i<N;i++)
     91         for(j=0;j<N-i;j++)
     92         {
     93             s=i+j;
     94             if(s<N)
     95             {
     96                 Arr[i][j]=s*(s+1)/2+((s%2==0)? j:i);
     97             }
     98         }
     99         for(i=N-1;i>0;i--)
    100             for(j=N-i;j<N;j++)
    101             {
    102                 Arr[i][j]=N*N-1-Arr[N-1-i][N-1-j];
    103             }
    104     for(i=0;i<N;i++)
    105     {
    106         for(j=0;j<N;j++)
    107             cout<<setw(6)<<Arr[i][j];
    108         cout<<endl;
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    为什么折价溢价的摊销属于借款费用?
    长期待摊费用
    合同负债
    未决诉讼
    AMD Ryzen 3600超频4.3
    强制删除软件
    wallpaper壁纸download下载失败
    ryzen3600超频4.3
    维度规约(降维)算法在WEKA代写中应用
    python代写虎扑社区论坛数据爬虫分析报告
  • 原文地址:https://www.cnblogs.com/cslave/p/2585167.html
Copyright © 2020-2023  润新知