数据结构之幻方连续摆数法

(1)幻方概念:

n阶幻方是指自然数1---n的平方排列成n*n阶方阵,其各行各列及对角线上的数字之和相等,和数S=n(n的平方+1)/2。

(2)连续摆数法概念:



(3)代码实现

import java.util.Scanner;

/**
 * @date 2017-5-31
 * @author liuffei
 * @description 求解n阶幻方
 */
public class MagicSquare {
	
	/**
	 * 连续摆数法:适用于构造奇数阶幻方
	 * @return
	 */
	public static int[][] continuousPendulumMethod(int n){
		//创建一个空的二维矩阵
		int[][] matrix = new int[n][n];
		int end = n*n;//最后一个数
		int begin = n/2 ;//开始的位置
		int count = 1;
		matrix[0][begin] = count;
		int i = 0,j = begin;//循环开始
		while(count < end){
			if(i == 0){
				i = n - 1;
				j = j + 1;
				matrix[i][j] = ++count;
			}
			//沿斜线上递增
			while(j < n - 1 && count < end && i > 0){
				i--;
				j++;
				if(0 != matrix[i][j]){
					//如果已经存在数字,就退到前一个数的下一行上
					i = i + 2;
					j = j - 1;
					matrix[i][j] = ++count;
				}else{
					matrix[i][j] = ++count;
				}
			}
			//当递增到右边时,折返到左边,此时i已经加1,j置为0
			while(j == n -1  && count < end){
				if(i == 0){
					i = 1;
				}else{
					j = 0;
					i = i - 1;
				}
				matrix[i][j] = ++count;
			}
		}
		return matrix;
	}
	
	 /**
     * 打印矩阵
     * @param matrix 矩阵
     */
    public static void printMatrix(int[][] matrix){
    	int row = matrix.length;
    	for(int i = 0;i < row;i++){
    		for(int j = 0;j < matrix[i].length;j++){
    			System.out.print(matrix[i][j] + " ");
    		}
    		System.out.println("");
    	}
    }
	
	public static void main(String[] args) {
		System.out.println("请输入奇数方阵的阶数:");
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int[][] matrix = continuousPendulumMethod(n);
		printMatrix(matrix);
	}
}

(4)实现效果


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值