zigzag数组的生成

来源:互联网 发布:淘宝毛线宝宝鞋 编辑:程序博客网 时间:2024/05/21 06:24

zigzag数组如下: 

 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

即:“之”字型的顺序,

分析思路:第i行第j列元素前面(对角线方式看:看左对角线上面的元素)经历了多少个元素。
例如: 
 0   1   5   6   
2   4   7  
3   8   
9   
其中8号元素(i=2,j=1)经历了一个3行递增的元素,和6 7元素。
于是总结归纳得到如下程序:

#include <stdio.h>#include <stdlib.h>int main(int agrc,char* agrv[]){int n;int i;int j;int** pArray;while (scanf("%d",&n) == 1){pArray = (int **)malloc(n * sizeof(void *));for( i = 0; i < n; i++){pArray[i] = (int *)malloc(sizeof(int)*n);}// 找到值域位置的关系,基本思路求在第i行j列时候,// 这个值前面经历了多少个元素// 时间复杂度为O(n^2)for( i = 0; i < n ; ++i){for(j = 0; j < n; ++j){if(i + j < n){//奇数行if((i+j)%2 != 0)  pArray[i][j] = (1+i+j)*(i+j)/2 + i;elsepArray[i][j] = (1+i+j)*(i+j)/2 + j;}else{//偶数行if((i+j)%2 == 0)pArray[i][j] = (1+n)*n/2 + (3*n -1 -i - j)*(i+j-n)/2 + n - i -1;// Or int s = (n-1-j)+(n-i-1);// pArray[i][j] = n*n - (s+1)*s/2 - (n - i -1)elsepArray[i][j] = (1+n)*n/2 + (3*n -1 -i - j)*(i+j-n)/2 + n - j -1;}}}for( int i = 0; i < n ; ++i){printf("\n");for(j = 0; j < n; ++j){printf("%4d",pArray[i][j]);}}printf("\n");}free(pArray);return 0;}


 

原创粉丝点击