题:输入n,求一个nXn矩阵,规定矩阵沿45度线递增,形成zigzag数组。请问如何用C++实现(中国台湾著名硬件公司2007年11月面试题)
下面是自己用C写的一个代码,在程序员面试宝典(第二版)P89~~有C++实现。
/* 打印zigzag数组 0 1 5 6 14 15 27 28 2 4 7 13 16 26 29 42 3 8 12 17 25 30 41 43 9 11 18 24 31 40 44 53 10 19 23 32 39 45 52 54 20 22 33 38 46 51 55 60 21 34 37 47 50 56 59 61 35 36 48 49 57 58 62 63 */
#include <stdlib.h> #include <stdio.h> #define N 8 int a[100][100]; void Print_Zigzag(int n); int main() { Print_Zigzag(N); for(int i=0;i<N;i++) { printf("\n"); for(int j=0;j<N;j++) printf("%d\t",a[i][j]); } return 0; } void Print_Zigzag(int n) { int m=0,i,j,k; for(k=0;k<2*n-1;k++) //规定:0作为第0排的数据,1,2作为第1排的数据....k表示第k排. for(i=0;i<n;i++) for(j=0;j<n;j++) { if(i+j==k) //第k排的数据符合如下规律:即每个数据的(行+列)=该数据所在的排k { if(k%2==0) //偶数排的数据斜向上递增 a[j][i]=m++; if(k%2==1) //奇数排的数据斜向下递增 a[i][j]=m++; } } }
运行结果:
程序员面试宝典中C++实现如下:
#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; }