概述
首先了解下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数组的全部内容,希望文章能够帮你解决Zigzag数组所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复