/*
* 1 2 3 4 5
* 16 17 18 19 6
* 15 24 25 20 7
* 14 23 22 21 8
* 13 12 11 10 9
* 思路:
* 这个矩阵,可以理解成,不撞南墙不调头,一直走到一条死胡同里,
*
* 定义一个二维数组记录每次行走的过程,而每次转弯之后都在同行或同列进行
* ,走过的地方不能在走,直到它上不能走下不能走,左不能走,右不能走。
* 即正好填满整个二维数组。
* 我的
* for(;i<arr.length-1;i++){
* if(arr[j][i+1]!=0){
* break;
* }
* arr[j][i]=count;
* count++;
* }
*
* 或者递增
* 0 1 2 3 4
* --------------
* 1 2 3 4 5 | 0
* 6 | 1
* 7 | 2
* 8 | 3
* 9 | 4
* 这是我们从里层四个小循环的思路。
*
*
* 我们知道一个这个数组是递增,每次的增涨值是一,
* 而这个数组正好是N×N的方形矩阵,最大
* 值就是N×N 那么这就是我们的大循环的边界。
* 我们可以理解成 行号不变长值是
*
* 从左至右
* 行号不变 列号自减
* 从上倒下 号不变
* */
public class Day_04_5 {
void fun(int num){
int[][] arr = new int[num][num];
int i = 0; // 列号,控制
int j = 0;// 行号,控制
int count = 1;
while (count < num*num) {
// 右 控制j不变 i自增
for (; i < arr.length - 1; i++) {
if (arr[j][i + 1] != 0) {
break;
}
arr[j][i] = count;
count++;
}
// 下 控制i不变 J自增
for (; j < arr[i].length - 1; j++) {
if (arr[j + 1][i] != 0) {
break;
}
arr[j][i] = count;
count++;
}
// 左 控制j不变 i自减
for (; i > 0; i--) {
if (arr[j][i - 1] != 0) {
break;
}
arr[j][i] = count;
count++;
}
// 上 控制i不变 j自减
for (; j > 0; j--) {
if (arr[j - 1][i] != 0) {
break;
}
arr[j][i] = count;
count++;
}
arr[j][i] = count;
// count++;
}
for (int x = 0; x < arr.length; x++) {
for (int k = 0; k < arr[x].length; k++) {
System.out.print(arr[x][k] + "\t");
}
System.out.println();
}
}
public static void main(String[] args) {
new Day_04_5().fun(5);
}
}
一个倔强的人,螺旋数组
最新推荐文章于 2023-01-24 12:50:49 发布