首先了解下zigzag数组,如下图,由一个矩阵的对角线,数字按一定规律递增
求nxn的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 */ class Zigzag{ public static void main(String[] args){ //int[][] a=nzigzag(8); int[][] a=zigzag2(8); print(a); } //解法一: public static int[][] nzigzag(int n){ int[][] a=new int[n][n]; int count=0; //记录当前应当填充的元素 int cross=0; //填充左上三角矩阵,包括对角线,按斜线输出,cross表示的是第几条斜线 //对于任意一个元素a[i][j],有i+j = cross for(cross=0;cross<n;cross++){ //如果填充第偶数条斜线,那么输出的方向是做左下角到右上角,终止的条件是行号i==0,或者列好j==N-1 if(cross%2==0){ for(int row=cross;row>=0;row--){ a[row][cross-row]=count++; } }else{ //如果填充第奇数数条斜线,那么输出的方向是做右上角到左下角 for(int col=cross;col>=0;col--){ a[cross-col][col]=count++; } } } //填充右下角矩阵,不包括对角线 int limit=1; //记录终止的行列号 for(cross=n-2;cross>=0;cross--){ if(cross%2==0){ for(int row=n-1;row>=limit;row--){ a[row][limit+n-1-row]=count++; } limit++; } else{ for(int col=n-1;col>=limit;col--){ a[limit+n-1-col][col]=count++; } limit++; } } return a; } //解法二: public static int[][] zigzag2(int n){ int value=0; int num; int i,j,k; for(i=0;i<n;i++){ num=0; if(i%2==0){ 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(i%2==0){ 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++; } } } return a; } public static void print(int[][] a){ for(int i=0;i<a.length;i++){ for(int j=0;j<a[0].length;j++){ System.out.print(a[i][j]+" "); } System.out.println(); } } }
---EOF---
时间: 2024-10-12 21:17:19