/** * 回旋矩阵 * * @author fzh * */ public class WhirlyMatrix { /** * 方阵的层数 */ private int n; /** * 矩阵的每一个元素的值 */ private int value; /** * 当前所在的行 */ private int row; /** * 当前所在的列 */ private int col; /** * 存储矩阵的数据 */ private int[][] data; public WhirlyMatrix() { super(); } public WhirlyMatrix(int n) { this.n = n; this.data = new int[this.n][this.n]; this.row = 0; this.col = n - 1; this.value = 1; this.data[row][col] = this.value; } /** * 填充数字 算法思路: 根据回旋矩阵的特点,最小值永远在第一行的最后一列。所以应该从第一行的最后一列开始填数。<br/> * 由于蛇形填数的特点是不断做顺时针旋转,所以外层循环只需判断所填的数字是否小于给定值的平方。<br/> * 内层的四个循环分别代表顺时针转圈的四个方向,↓,←,↑,→。<br/> * 内层的每个循环的判断条件均用来限定方向的边界以及判断当前位置的下一个位置是否可填数,以控制循环的走向。<br/> */ public void fillNumber() { while (this.value < n * n) { /** * 从上往下 */ while (this.row + 1 <= this.n - 1 && this.data[this.row + 1][this.col] == 0) { this.data[++this.row][this.col] = ++this.value; } /** * 从右到左 */ while (this.col - 1 >= 0 && this.data[this.row][this.col - 1] == 0) { this.data[this.row][--this.col] = ++this.value; } /** * 从下到上 */ while (this.row - 1 >= 0 && this.data[this.row - 1][this.col] == 0) { this.data[--this.row][this.col] = ++this.value; } /** * 从左到右 */ while (this.col + 1 <= this.n - 1 && this.data[this.row][this.col + 1] == 0) { this.data[this.row][++this.col] = ++this.value; } } } /** * 输出矩阵 */ public void print() { for (int i = 0; i < this.n; i++) { for (int j = 0; j < this.n; j++) { System.out.printf("%3d", this.data[i][j]); } System.out.println(); } } }
测试一下:
package com.meession.practice.day0726.test; import com.meession.practice.day0726.entity.WhirlyMatrix; public class WhirlyMatrixDemo { public static void main(String[] args) { WhirlyMatrixDemo wmd = new WhirlyMatrixDemo(); wmd.test(); } public void test(){ int n = (int)(Math.random()*8 + 1); System.out.println("随机生成的矩阵层数是:" + n); WhirlyMatrix wm = new WhirlyMatrix(n); System.out.println("回旋矩阵为:"); wm.fillNumber(); wm.print(); } }
感悟:同样的题目,不同的时间段,写出来的大有不同;也许,这就是进步吧。
------------------------------------
限于篇幅,多个操作Matrix的方法都写到Matrix类里面去了。按理来说,这应该是写在服务层的。