几个蛇形矩阵实现

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

实现几种

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);
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值