Zigzag数组

首先了解下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---


你可能感兴趣的:(Zigzag数组)