第一种:螺旋状
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();
}
}
运行结果: