1. 程式人生 > >【java】蛇形填數 螺旋填數

【java】蛇形填數 螺旋填數

蛇形填數

在n*n的方陣裡填成蛇形,例如:    

1    2    3   4  5 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
13 12 11 10 9

原理:建立一個二維陣列,將陣列清零,用a[i][j]==0判斷該位置是否已填數,用x,y記錄下一個數的座標,t記錄填入的數字。

樣例輸入:

5

樣例輸出:

1 2 3 4 5 
16 17 18 19 6 
15 24 25 20 7 
14 23 22 21 8 
13 12 11 10 9 

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext())
		{
			int n=scanner.nextInt();
			int[][] a=new int[n][n];
			for(int[] temp:a){
				Arrays.fill(temp, 0);
			}
			int t=1,x=0,y=0;
			a[0][0]=t;
			while(t<n*n){
				while(y+1<n&&(a[x][y+1]==0))
					a[x][++y]=++t;
				while(x+1<n&&(a[x+1][y]==0))
					a[++x][y]=++t;
				while(y-1>=0&&(a[x][y-1]==0))
					a[x][--y]=++t;
				while(x-1>=0&&(a[x-1][y]==0))
					a[--x][y]=++t;
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					System.out.print(a[i][j]+" ");
				}
				System.out.println();
			}
		}
		scanner.close();
	}
}

如果蛇形填數要求的形狀是:

13 14 15 16 1 
12 23 24 17 2 
11 22 25 18 3 
10 21 20 19 4 
 9   8   7    6  5 

只需對以上程式碼稍作修改即可,原理相同。

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext())
		{
			int n=scanner.nextInt();
			int[][] a=new int[n][n];
			for(int[] temp:a){
				Arrays.fill(temp, 0);
			}
			int t=1,x=0,y=n-1;
			a[0][n-1]=t;
			while(t<n*n){
				while(x+1<n&&(a[x+1][y]==0))
					a[++x][y]=++t;
				while(y-1>=0&&(a[x][y-1]==0))
					a[x][--y]=++t;
				while(x-1>=0&&(a[x-1][y]==0))
					a[--x][y]=++t;
				while(y+1<n&&(a[x][y+1]==0))
					a[x][++y]=++t;
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					System.out.print(a[i][j]+" ");
				}
				System.out.println();
			}
		}
		scanner.close();
	}
}

螺旋填數

在n*n的方陣裡螺旋填數,例如:

13 12 11 10 25 
14  3    2  9  24 
15  4   1   8  23 
16  5   6   7  22 
17 18 19 20 21 

原理仍與蛇形填數一樣,只不過t從大到小填而已。

樣例輸入:

6

樣例輸出:

21 20 19 18 17 36 
22 7 6 5 16 35 
23 8 1 4 15 34 
24 9 2 3 14 33 
25 10 11 12 13 32 
26 27 28 29 30 31

import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner scanner = new Scanner(System.in);
		while(scanner.hasNext())
		{
			int n=scanner.nextInt();
			int[][] a=new int[n][n];
			for(int[] temp:a){
				Arrays.fill(temp, 0);
			}
			int t=n*n,x=0,y=n-1;
			a[0][n-1]=t;
			while(t>1){
				while(x+1<n&&(a[x+1][y]==0))
					a[++x][y]=--t;
				while(y-1>=0&&(a[x][y-1]==0))
					a[x][--y]=--t;
				while(x-1>=0&&(a[x-1][y]==0))
					a[--x][y]=--t;
				while(y+1<n&&(a[x][y+1]==0))
					a[x][++y]=--t;
			}
			for(int i=0;i<n;i++){
				for(int j=0;j<n;j++){
					System.out.print(a[i][j]+" ");
				}
				System.out.println();
			}
		}
		scanner.close();
	}
}