实现回旋转圈矩阵,比如输入3,从中心开始转圈输出如下图所示
int i=3;
7 8 9
6 1 2
5 4 3
- 思路
方案一:先确定起始点位,然后顺时针按步走,如果下一步的点位有值就保持原来的前进方向走一步。
方案二:先确定最终点位,然后逆时针按步走,如果到达边界就转换方向。
public class CircleMatrix {
// 回旋转圈矩阵
public static void main(String[] args){
int x = 5;
// 初始化x乘x矩阵,点位初始值为0
int[][] matrix = new int[x][x];
// 初始化,i,j是坐标点位;z表示上一步前进的方向;value是点位上的值
int i=0,j=0,z=0, value=1;
// 确定起始点位,奇偶数的起始点位不同
if (isOddNumber(x)){
i = ((int) x/2)+1-1;
} else {
i = (int) x/2-1;
}
j=i;
// 遍历每一个点位
for (int n=0; n<x*x; n++){
matrix[i][j] = value;
if (z == 0){
j++;
z=1;
} else if (z == 1){
// 如果前面向右走,现在应该向下走,向下点位有值就继续向右走
if (i+1 < x && matrix[i+1][j] == 0){
i++;
z=2;
} else {
j++;
}
} else if (z == 2){
// 如果前面向下走,现在应该向左走,向左点位有值就继续向下走
if (j-1 >=0 && matrix[i][j-1] == 0){
j--;
z=3;
} else {
i++;
}
} else if (z == 3){
// 如果前面向左走,现在应该向上走,向上点位有值就继续向左走
if (i-1 >=0 && matrix[i-1][j] == 0){
i--;
z=4;
} else {
j--;
}
} else if (z == 4){
// 如果前面向上走,现在应该向右走,向右点位有值就继续向上走
if (j+1 < x && matrix[i][j+1] == 0){
j++;
z=1;
} else {
i--;
}
}
// 矩阵计数点位值加1
value++;
}
// 输出结果
for (int[] rows:matrix) {
for (int v:rows) {
System.out.print(v + "\t");
}
System.out.println();
}
}
// 判断数值i是否是奇数,i小于0时返回false
public static boolean isOddNumber(int i){
if (i<0) {
throw new RuntimeException("参数不符合规范");
}
return i%2 == 1;
}
}
int i=4;
7 8 9 10
6 1 2 11
5 4 3 12
16 15 14 13
int i=5;
21 22 23 24 25
20 7 8 9 10
19 6 1 2 11
18 5 4 3 12
17 16 15 14 13