OJ水题-----蛇形填数

描述:  

在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方阵为:

10 11 12 1
9 16 13 2
8 15 14 3
7 6 5 4

输入:直接输入方陈的维数,即n的值。(n<=100)

输出:输出结果是蛇形方陈。

输入数据:

3

输出数据:

7 8 1
6 9 2
5 4 3

/***************************************************************************/

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] arr = new int[n][n];
		
		for(int i=0;i<n;i++){
			for(int z=0;z<n;z++){
				arr[i][z] = 0;
			}
		}
		
		int number = 1;
		
		Direction d = Direction.down;
		
		int x=0;
		int y=n-1;
		while(number < n*n){
			if(d == Direction.down){
				if(x == n-1 || arr[x+1][y] != 0){
					d = Direction.left;
				}else{
					arr[x][y]= number;
					number ++ ;
					x++;
				}
			}
			
			if(d == Direction.left){
				if(y==0 || arr[x][y-1] != 0){
					d = Direction.up;
				}else{
					arr[x][y]= number;
					number ++ ;
					y--;
				}
			}
			
			if(d == Direction.up){
				if(x == 0 || arr[x-1][y] != 0){
					d = Direction.right;
				}else{
					arr[x][y]= number;
					number ++ ;
					x--;
				}
			}
			
			if(d == Direction.right){
				if(y == n-1 || arr[x][y+1] !=0){
					d = Direction.down;
				}else{
					arr[x][y]= number;
					number ++ ;
					y++;
				}
			}
		}
		for(int i=0;i<n;i++){
			for(int z=0;z<n;z++){
				if(arr[i][z] == 0){
					arr[i][z] = n*n;
				}
				System.out.print(arr[i][z]+" ");
			}
			System.out.println();
		}
	}
}

enum Direction{
	down,left,up,right
}

只要存数字时按照方向来就存就行了,如果到边界或者下一个有数字了就让他转向存.这里有个问题,如果把最后一个数字也在循环里面放进去的话 就进入无限循环了..不知道怎么跳出,干脆就在输出的时候把这个数字替换掉了...

你可能感兴趣的:(OJ水题-----蛇形填数)