面试碰到问蛇形矩阵实现。。。
实现几种
import java.util.Scanner;
public class Snake {
/**
* snake类型一:
* 1 2 3
* 8 9 4
* 7 6 5
* n表示行列数
* @author liang
*/
public static void snake1(int n){
int[][] sn = new int[n][n];
int point = 0;//0向右移动,1向下,2向左,3向上
int i = 0,j = 0;
int number = 1;
while(number<=n*n){
switch(point){
case 0://向右移动,设置参数
while(j<n&&sn[i][j]==0){//当前列数<n,当前数组位置值为0
sn[i][j] = number;
j++;
number++;
}
j--;//回到最后修改0的坐标位置
i++;//向下移动一格,到达转变角度后的第一个位置
point = 1;
break;
case 1:
while(i<n&&sn[i][j]==0){
sn[i][j] = number;
i++;
number++;
}
i--;
j--;
point = 2;
break;
case 2:
while(j>=0&&sn[i][j]==0){
sn[i][j] = number;
j--;
number++;
}
j++;
i--;
point = 3;
break;
case 3:
while(i>=0&&sn[i][j]==0){
sn[i][j] = number;
i--;
number++;
}
i++;
j++;
point = 0;
break;
}
}
for(int a=0;a<n;a++){
for(int b=0;b<n;b++)
System.out.print(sn[a][b]+"\t");
System.out.println();
}
}
/**
* 对类型一的简化
* snake类型一:
* 1 2 3
* 8 9 4
* 7 6 5
* n表示行列数
* @author liang
*/
public static void snake1Second(int n){
int[][] sn = new int[n][n];
int i = 0,j = 0;
int number = 1;
sn[0][0] = 1;
while(number<n*n){
while(j+1<n && sn[i][j+1]==0)//向右
sn[i][++j] = ++number;
while(i+1<n && sn[i+1][j]==0)//向下
sn[++i][j] = ++number;
while(j-1>=0 && sn[i][j-1]==0)//向左
sn[i][--j] = ++number;
while(i-1>=0 && sn[i-1][j]==0)//向上
sn[--i][j] = ++number;
}
print(sn);
}
/**
* snake类型二:
* 1 2 6
* 3 5 7
* 4 8 9
* @author liang
*/
public static void snake2(int n){
int[][] sn = new int[n][n];
int point = 0;//0向右移动,1向左下,2向下,3向右上
int i = 0,j = 0;
sn[i][j] = 1;
int number = 2;
while(number<=n*n){
switch(point){
case 0:
j++;
if(j<n&&sn[i][j]==0){
sn[i][j] = number;
number++;
}else{
j--;
}
point=1;
break;
case 1:
j--;
i++;
while(j>=0&&i<n&&sn[i][j]==0){
sn[i][j] = number;
number++;
j--;
i++;
}
j++;
i--;
point=2;
break;
case 2:
i++;
if(i<n&&sn[i][j]==0){
sn[i][j] = number;
number++;
}else{
i--;
}
point=3;
break;
case 3:
i--;
j++;
while(i>=0&&j<n&&sn[i][j]==0){
sn[i][j] = number;
number++;
i--;
j++;
}
i++;
j--;
point=0;
break;
}
}
print(sn);
}
/**
* 1 3 6 10
2 5 9 13
4 8 12 15
7 11 14 16
* @author liang
*/
public static void snake3(int n){
int[][] sn = new int[n][n];
int number = 1;
for(int i=1;i<2*n;i++){//一共2n-1排
if(i<=n){
int startPoint = i-1;
for(int j=0;j<i;j++){
sn[startPoint--][j] = number++;
}
}else{
int startPoint = n-1;
for(int j=i-n;j<n;j++){
sn[startPoint--][j] = number++;
}
}
}
print(sn);
}
/**
* snake类型二:
* 1 2 6
* 3 5 7
* 4 8 9
* @author liang
*/
public static void snake4(int n){
int[][] sn = new int[n][n];
int number = 1;
for(int i=1;i<2*n;i++){
if(i<=n){
int e = 0;
int s = i-1;
for(int k = 0;k < i;k++){
if(i%2 ==1){
sn[s--][e++] = number++;
}else{
sn[e++][s--] = number++;
}
}
}else{
int e = n - 1;
int s = i - n;
for(int k = 0;k < 2*n - i;k++){
if(n%2 == 1){//则中间的斜线(如4,5,6)是从下到上顺序
if(i%2 == 1){
sn[e--][s++] = number++;//从 左下 到 右上
}else{
sn[s++][e--] = number++;//从 右上 到 左下
}
}else if(n%2 == 0){
if(i%2 == 0){
sn[s++][e--] =number++;
}else{
sn[e--][s++] =number++;
}
}
print(sn);
}
}
}
print(sn);
}
public static void print(int[][] sn){
int n = sn.length;
for(int a=0;a<n;a++){
for(int b=0;b<n;b++)
System.out.print(sn[a][b]+"\t");
System.out.println();
}
System.out.println();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
snake1Second(a);
}
}