蛇形矩阵的实现_1

通过java实现两种不同的蛇形矩阵。

之前在一个面试题上看到了一个关于写出一个蛇形矩阵的问题,当时很是纠结,后来分析了一下之后,就觉的问题不是那么的难了。
目前我见过的蛇形矩阵的考法有两种,一种是对角线式的蛇形矩阵,另一种是回旋绕的蛇形矩阵:
**1 3   4   10**    
**2 5   9** 11  
**6 8** 12  15  
**7**   13  14  16
对于对角线的类型来说,是比较简单的。
1.首先我们可以观察数字从小到大的变化,会发现其实角标的变化分别是。
0 0   0 1   0 2     0 3 
1 0   1 1   1 2     1 3 
2 0   2 1   2 2     2 3 
3 0   3 1   3 2     3 3
    就会发现前一个角标的变化规律是0 |1,0| 2,1,0 |3,2,1,0| 
      后一个角标的变化是    0 |0,1|0,1,2|0,1,2,3|
      这个时候,在蛇转换方向的是时候,我们还需要调整一下递增和递减的关系!!!
      于是,规律就来了。我们可以先写出一个三角形,然后在写另一个三角形,是不是就会容易的很多!!!
boolean flag=ture;//定义了一个标志位。   
for(int e=0;e<arr.length ;e++){
            if(flag){
                for(int c = e,d=0;c>=0 && d<=e;c--,d++){
                //两个角标的数字封边递增和递减
                    arr[c][d] = k++;
                }
                flag = !flag;//调整方向后,更改角标用来实现反方向的数值增加过程!
            }else{
                for(int c = e,d=0;c>=0 && d<=e;c--,d++){
                    arr[d][c] = k++;
                }
                flag = !flag;
            }
于是我们就能够实现以个三角形的矩阵了!!
**1 3   4   10**    
**2 5   9** 0   
**6 8** 0   0   
**7**   0   0   0
那么,另一个三角形用和上面相反的思路就可以了!!!
下面是完整的程序的代码:
package samsung.kangjian.test;
 /**
  * 蛇形矩阵
  * @author JianKang
  *
  */
public class SnakeArray {
    static boolean flag = true;
    static int k = 1;
    public static void main(String[] args){
        snake1(4);
    }   
    public static void snake1(int x){
        int arr[][] = new int[x][x];
        //正三角形的输入
        for(int e=0;e<arr.length ;e++){
            if(flag){
                for(int c = e,d=0;c>=0 && d<=e;c--,d++){
                    arr[c][d] = k++;
                }
                flag = !flag;
            }else{
                for(int c = e,d=0;c>=0 && d<=e;c--,d++){
                    arr[d][c] = k++;
                }
                flag = !flag;
            }
        }
        //倒三角形的输入。
        for(int g = 1;g<arr.length;g++){
            if(flag){
                for(int h = g,i=arr.length-1;h<arr.length && i>0;h++,i--){
                    arr[i][h] = k++;
                }
                flag= !flag;
            }else{
                for(int h = g,i=arr.length-1;h<arr.length && i>0;h++,i--){
                    arr[h][i] = k++;
                }
                flag= !flag;
            }
        }   
        for(int a = 0;a<arr.length;a++){
            for(int b=0;b<arr.length;b++){
                System.out.print(arr[b][a]+"    ");
            }
            System.out.println("");
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值