今天去智度科技面试,遇到一个算法题,没有答上,可惜了这次机会。
从矩阵的左上角出发,初始时向右移动;如果前方是未曾经过的格子,则继续前进,否则右转;重复上述操作直至经过矩阵中所有格子。根据经过顺序,在格子中依次填入1, 2, 3, … , n1,2,3,…,n,便构成了一个螺旋矩阵。2
下图是一个n = 4n=4 时的螺旋矩阵。
实现算法如下:
public static void getLuoXuan(int n){
int[][] arr = new int[n][n];
int m; //m表示循环的次数,如果n为偶数的话就循环n/2次,n为奇数的话就循环(n+1)/2次
if (n%2==0)//n为偶数
m=n/2;
else
m=(n+1)/2;
int value=1;
for (int i=0;i<m;i++){
for (int a=i;a<=n-i-1;a++){ //从左到右
arr[i][a]=value++;
}
for (int b =i+1;b<=n-i-1;b++){//从上到下
arr[b][n-i-1]=value++;
}
for (int c=n-i-2;c>=i;c--){//从右到左
arr[n-i-1][c]=value++;
}
for (int d =n-i-2;d>=i+1;d--){//从下到上
arr[d][i]=value++;
}
}
for (int i=0;i<n;i++){
for (int j=0;j<n;j++){
System.out.print(arr[i][j]+" ");
}
System.out.println();
}
}