几个蛇形矩阵实现

来源:互联网 发布:我的世界js制作器教程 编辑:程序博客网 时间:2024/05/29 09:08

面试碰到问蛇形矩阵实现。。。

实现几种

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,当前数组位置值为0sn[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);}/** *     13610259134812157111416 * @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);}}