螺旋方阵 JAVA版实现

以下是一个5*5阶螺旋方阵, 请写出程序, 输出N*N阶的方阵(顺时针方向递进)

如下图所示

看图, 分析, 我们可以发现一个规律, 螺旋递进可以分为4个步骤

  1. 由左到右
  2. 由上到下
  3. 由右到左
  4. 由下到上

将其分为4个小步骤之后我们又可以发现, 每当执行完这4个步骤后, 螺旋方阵的阶次就减少了2, (例如, 当前图 5阶方阵执行完4个步骤, 变成了3阶方阵)

每一步赋值时, 首尾的地方会重复, 则第一步赋值由首位开始, 第二步赋值则向下偏移一位, 避免重复, 下面两步也是如此, 需要偏移一位赋值

每一步方法的实现(重点)

首先, 我们对方阵建立一个二维坐标系, 如下图

我们使用一个二维数组来承载这个方阵 int matrix[][] = new int[N][N];, 这样就变得非常简单了

以从左到右这步为例子,  我们只需要 确定3个数字既可以完成赋值, 分别为左上点, 左右点, 以及Y值,

对代码进行分析

左上点为 int lt = (M - N) / 2;      即为, 原方阵的阶次 减去 当前方阵的阶次 再除以 2 , 以为方阵缩小是向着中心缩小, 左右都一起缩小

则除以二, 既可以得到左上 点, 以后 个点都是由此方法得到的

static void left_to_right(int num[][], int M, int N) {    
        int lt = (M - N) / 2;                             // 左上点, 
        int rt = (M - N) / 2 + N -1;
        int y = (M - N) / 2;
        
        for(int i=lt; i<=rt; i++) {
            num[y][i] = count;
            count ++;
        }
    }

java代码实现

public class Main{
	
	static int count = 1;
	
	public static void main(String[] args) {
		int N = 0;
		Scanner input = new Scanner(System.in);
		N = input.nextInt();
		input.close();
		
		int matrix[][] = new int[N][N];
		matrix[0][0] = 1;
		
		int M = N;
		while(true) {
			left_to_right(matrix, N, M);
			top_to_bottom(matrix, N, M);
			right_to_left(matrix, N, M);
			bottom_to_top(matrix, N, M);
			M -= 2;
			
			if(M < 1) {
				break;
			}
			
		}
		
		for(int i=0; i<N; i++) {
			for(int j=0; j<N; j++) {
				String num = String.format("%4d ", matrix[i][j]);
				System.out.print(num);
			}
			System.out.println("");
		}
		
	}
	
	
	// 4个步骤   参数分别为, 存储的数组, 原方阵阶数,  当前方阵阶数
	static void left_to_right(int num[][], int M, int N) {	
		int lt = (M - N) / 2;
		int rt = (M - N) / 2 + N -1;
		int y = (M - N) / 2;
		
		for(int i=lt; i<=rt; i++) {
			num[y][i] = count;
			count ++;
		}
	}
	static void top_to_bottom(int num[][], int M, int N) {
		int rt = (M - N) / 2 + 1;
		int rb = (M - N) / 2 + N -1;
		int x = (M - N) / 2 + N - 1;
		
		for(int i=rt; i<=rb; i++) {
			num[i][x] = count;
			count ++;
		}
	}
	static void right_to_left(int num[][], int M, int N) {
		int rb = (M - N) / 2 + N -1 -1;
		int lb = (M - N) / 2; 
		int y = (M - N)/2 + N - 1;
		
		for(int i=rb; i>=lb; i--) {
			num[y][i] = count;
			count ++;
		}
	}
	static void bottom_to_top(int num[][], int M, int N) {
		int lb = (M - N) / 2 + N -1 -1;
		int lt = (M - N) / 2;
		int x = (M - N) / 2;
		
		for(int i=lb; i>lt; i--) {
			num[i][x] = count;
			count ++;
		}
	}
}

运行结果展示

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值