蛇形矩阵

第一种:螺旋状           

package test0920;
import java.util.Scanner;
/**
 * 
* Title: SerpentineMatrix 
* Description: 蛇形矩阵就是一个二维数组,把二维数组从外到内一层一层剥开,按照
* 上、右、下、左的顺序走即可。(注意临界值条件,尤其是拐角别重叠覆盖)
* @author Marmara  
* @date 2018年9月25日
 */
public class SerpentineMatrix {

	public static void main(String[] args) {
		System.out.println("please input n:");
		Scanner s=new Scanner(System.in);
		int n=s.nextInt();//输入矩阵的维数
		int a[][]=new int [n][n];
		int count=1;//每走一步加一
		for (int i = 0; i < n / 2 + 1; i++) {
			// up
			for (int j = i; j < n - i; j++) {
				a[i][j] = count++;
			}
			// right
			for (int j = i + 1; j < n - i; j++) {
				a[j][n - i - 1] = count++;
			}
			// down
			for (int j = n - i - 2; j >= i; j--) {
				a[n - i - 1][j] = count++;
			}
			// left
			for (int j = n - i - 2; j > i; j--) {
				a[j][i] = count++;
			}
		}
		for(int i=0;i<n;i++) {
			for(int j = 0;j<n;j++) {
				System.out.print(a[i][j]+"\t");
				if(j==n-1) {
					System.out.println();
				}
			}			
		}
	}
}

运行结果:

第二种:上三角

package Snake;

import java.util.Scanner;
/**
 * 

* Title: ShangSanjiao 

* Description: 观察每一行的数字 每两个数字之间的差值是有规律的;
* 观察每两列的数字之间的差值也是有规律的,利用规律解题

* @author Marmara  

* @date 2018年11月29日
 */
public class ShangSanjiao {

	public static void main(String[] args) {

		System.out.println();
		Scanner cin = new Scanner(System.in);
		int T;// 行数
		int A = 1;// 第一行第一列的初始值
		int B;// 每一列的初始值
		T = cin.nextInt();
		for (int i = 1; T > 0; T--, i++) {// i控制每一列与下一列的增量
			B = A;
			for (int k = 0, j = i + 1; k < T; k++, j++) {// k控制每一行的列数 , j控制一行之内每两个数字的增量
				System.out.print(B + " ");
				B = B + j;
			}
			System.out.println();
			A = A + i;
		}
	}
}

 运行结果:


第三种:对角线走法

package Snake;

import java.util.*;
/**
 * 

* Title: DuiJiaoXian 

* Description: 对角线走法

* @author Marmara  

* @date 2018年11月29日
 */
public class DuiJiaoXian {
    private int n;
 
    public DuiJiaoXian(int n) {
        this.n = n;
    }
 
    public void print() {
        int[][] data = new int[n][n];
 
        data[0][0] = 1;
        data[n-1][n-1] = n * n;
 
        //根据蛇形矩阵的特点,分为上下两部分,以斜线为单位计算数据,从1开始编号
        //本矩阵将从左至右为开始
        //Top:上半部分,负责对角线,斜线数为k,1<=k<=(n-1),对于矩阵阶数n不区分奇偶,k区分
        //每条斜线的最小数成递增数列,以1为开始
        for (int k = 1; k <= n-1; k++) {
            if (k % 2 == 1) {  //当k为奇数时,没条线的最小数在上方
                data[0][k] = 1 + k * (k + 1)/2;
 
                for (int i = 1; i <= k; i++) { //每条线需要计算k条数据
                    data[i][k-i] = data[0][k] + i; //行与列之和为k,从上往下计算,列递减
                }
            } else {//当k为偶数时,没条线的最小数在下方
                data[k][0] = 1 + k * (k + 1)/2;
 
                for (int i = 1; i <= k; i++) {
                    data[k-i][i] = data[k][0] + i;
                }
            }
        }
 
        //Down:上半部分,不负责对角线,斜线数为k,1<=k<=(n-2),对于矩阵阶数n区分奇偶,k也区分
        每条斜线的最大数成递减数列,以n*n为开始
        if (n % 2 == 1) {//n为奇数
            for (int k = 1; k <= n - 2; k++) {
                if (k % 2 == 0) { //如果k为偶数,最大数在下方
                    data[k][n-1] = data[n-1][n-1] - (n - k - 1) * (n - k)/2;
                    for (int i = 1; i < n - k; i++) { //从上至下,依次计算n-1-k条数据
                        data[i + k][n-1-i] = data[k][n-1] - i;  //行递增,列递减,和为n+k-1
                    }
                } else {//如果k为偶数,最大数在下方
                    data[n - 1][k] = data[n - 1][n - 1] - (n - k - 1) * (n - k) / 2;
                    for (int i = 1; i < n - k; i++) { //从下至上,依次计算n-1-k条数据
                        data[n - 1 - i][i + k] = data[n - 1][k] - i;  //行递减,列递增,和为n+k-1
                    }
                }
            }
 
        } else { //n为奇数,正好与偶数情况相反
            for (int k = 1; k <= n - 2; k++) {
                if (k % 2 == 1) { //如果k为奇数,最大数在下方
                    data[n-1][k] = data[n-1][n-1] - (n - k - 1) * (n - k)/2;
                    for (int i = 1; i < n - k; i++) { //从上至下,依次计算n-1-k条数据
                        data[n-1-i][i+k] = data[n-1][k] - i;  //行递减,列递增,和为n+k-1
                    }
                } else {//如果k为偶数,最大数在上方
                    data[k][n-1] = data[n - 1][n - 1] - (n - k - 1) * (n - k) / 2;
                    for (int i = 1; i < n - k; i++) { //从下至上,依次计算n-1-k条数据
                        data[i+k][n-i-1] = data[k][n-1] - i;  //行递增,列递减,和为n+k-1
                    }
                }
            }
        }
 
        for (int i = 0; i < data.length; i++) {
            for (int j = 0; j < data[i].length; j++) {
                System.out.print(data[i][j] + " ");
            }
            System.out.println();
        }
 
    }
 
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
 
        System.out.println("请输入一个蛇形矩阵的阶数:");
        DuiJiaoXian sn = new DuiJiaoXian(scan.nextInt());
        sn.print();
    }
}

运行结果:

 

 

 

 

 

 

 

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值