给定一个常数N,得到一个N*N的二维正方形矩阵,矩阵的排列规则犹如螺旋的蛇形。
例如给定常数4,得
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
例子:3
1 2 3
8 9 4
7 6 5
代码思想:
设定两个索引,i表示第i行,j表示第j列
1,右移,行i不变,列j自增,开始向右赋值,遍历到没有赋过值得最右端,转下移2;
2,下移,列j不变,行i自增,开始向下赋值,遍历到没有赋过值得最下端,转左移3;
3,左移,行i不变,列j自减,开始向左赋值,遍历到没有赋过值得最左端,转上移4;
4,上移,列j不变,行i自减,开始向上赋值,遍历到没有赋过值得最上端,转右移2;
当赋值到N*N的时候,即可得蛇形正方形矩阵。
代码如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Snake {
public static void main(String []args){
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
try{
str = br.readLine();
}catch(IOException e){
e.printStackTrace();
}
int N= Integer.parseInt(str);
int[][] arr = getSnakeArray(N);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}
//蛇形矩阵
public static int[][] getSnakeArray(int N){
if(N<=0){
return null;
}
boolean flagDown =false;
boolean flagLeft = false;
boolean flagTop =false;
boolean flagRight =true;
int sum = N*N;
int j=0;
int i=0;
int [][]arr = new int[N][N];
arr[0][0] = 1;
for(int count=2;count<=sum;count ++){
//1,右移,行i不变,列j自增,开始向右赋值,遍历到没有赋过值得最右端,转下移2;
if(flagRight&&j+1<N&&arr[i][j+1]==0){
j++;
arr[i][j]=count;
}else if(flagRight){
flagDown=true;
flagLeft = false;
flagTop =false;
flagRight =false;
count--;
continue;
}
//2,下移,列j不变,行i自增,开始向下赋值,遍历到没有赋过值得最下端,转左移3;
if(flagDown&&i+1<N&&arr[i+1][j]==0){
i++;
arr[i][j]=count;
}else if(flagDown){
flagLeft=true;
flagDown =false;
flagTop =false;
flagRight =false;
count--;
continue;
}
//3,左移,行i不变,列j自减,开始向左赋值,遍历到没有赋过值得最左端,转上移4;
if(flagLeft&&j-1>=0&&arr[i][j-1]==0){
j--;
arr[i][j]=count;
}else if(flagLeft){
flagTop=true;
flagDown =false;
flagRight = false;
flagLeft =false;
count--;
continue;
}
//4,上移,列j不变,行i自减,开始向上赋值,遍历到没有赋过值得最上端,转右移2;
if(flagTop&&i-1>=0&&arr[i-1][j]==0){
i--;
arr[i][j]=count;
}else if(flagTop){
flagRight=true;
flagDown =false;
flagLeft = false;
flagTop =false;
count--;
continue;
}
}
return arr;
}
}