/** * 描述:打印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 * * Date: 2011-08-08 */ #include <iostream> #include <iomanip> using namespace std; int a[100][100]; void PrintZigzag(int n) { int value = 0; int i,j,k; int num; //上三角 for (i=0; i<n; i++) { num = 0; if (0 == i % 2) {/*偶数*/ j = i; k = 0; while (num++ <= i) { a[j--][k++] = value++; } } else {/*奇数*/ j = 0; k = i; while (num++ <= i) { a[j++][k--] = value++; } } } //下三角 for (i = n-2; i >= 0; i--) { num = 0; if (0 == i % 2) {/*偶数*/ j = n - 1; k = n -1 - i; while (num++ <= i) { a[j--][k++] = value++; } } else {/*奇数*/ j = n - 1 - i; k = n - 1; while (num++ <= i) { a[j++][k--] = value++; } } } } /** * test */ int main() { int n, i, j; cin >> n; for(i = 0; i < n; i++) { for (j = 0; j < n; j++) { a[i][j] = 0; } } PrintZigzag(n); for(i = 0; i < n; i++) { for (j = 0; j < n; j++) { cout << setw(4) << a[i][j]; } cout << endl; } return 1; }
当然,有一种十分巧妙的方法如下。
#include <stdio.h> #include <stdlib.h> int main() { int N; int s, i, j; int squa; scanf("%d", &N); /* 分配空间 */ int **a = (int **)malloc(N * sizeof(int *)); if(a == NULL) return 0; for(i = 0; i < N; i++) { if((a[i] = (int *)malloc(N * sizeof(int))) == NULL) { while(--i>=0) free(a[i]); free(a); return 0; } } /* 数组赋值 */ squa = 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 + (((i+j)%2 == 0)? j : i); } else { /*下三角*/ s = (N-1-i) + (N-1-j); a[i][j] = squa - s*(s+1)/2 - (N - (((i+j)%2 == 0)? j : i)); } } /* 打印输出 */ for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { printf("%6d", a[i][j]); } printf("\n"); } return 1; }