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



 

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值