魔方阵,奇数阵。输入一个奇数,产生一个魔方阵

package com.test.dailyTest.doSome;

import java.util.Scanner;
import java.util.regex.Pattern;
import org.apache.commons.lang3.StringUtils;

public class Njie {
	public static void main(String[] args) throws Exception {
		System.out.println("n阶举证-奇数");
		System.out.println("*****输入一个奇数*****");
		System.out.println("*********************");
		while (true) {
			Scanner cin = new Scanner(System.in);
			String num = cin.nextLine();
			if (StringUtils.isEmpty(num)) {
				num = "aa";
			}
			Pattern pattern = Pattern.compile("[0-9]*");
			if (pattern.matcher(num).matches()) {
				int Num = Integer.valueOf(num);
				int[][] numArr = getArr(Num);
				// 打印输出
				for (int i = 0; i < numArr[0].length; i++) {// 列长度
					for (int j = 0; j < numArr.length; j++) {// 行长度
						System.out.print(numArr[i][j] + "  ");
					}
					System.out.println();
				}
			} else {
				System.out.println("您输入的不是数字");
			}
		}

	}

	private static int[][] getArr(int Num) {
		int sum = Num * Num;

		int[][] numArr = new int[Num][Num];
		int firstIndex = (numArr.length - 1) / 2;
		numArr[0][firstIndex] = 1;
		int currentX = 0;
		int currentY = firstIndex;
		// 寻找下一个点
		for (int i = 2; i <= sum; i++) {
			int nextX = currentX - 1;
			int nextY = currentY - 1;
			if (nextX < 0 && nextY < 0) {
				nextX = currentX + 1;
				nextY = currentY;
			} else {
				if (nextX < 0) {
					nextX = nextX + Num;
				}
				if (nextY < 0) {
					nextY = nextY + Num;
				}
			}
			if (numArr[nextX][nextY] == 0) {
				numArr[nextX][nextY] = i;
			} else {
				nextX = currentX + 1;
				nextY = currentY;
				numArr[nextX][nextY] = i;
			}
			currentX = nextX;
			currentY = nextY;
		}
		return numArr;
	}
}

  

效果图如下

n阶举证-奇数
*****输入一个奇数*****
*********************
5
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11

时间: 2024-08-02 16:24:15

魔方阵,奇数阵。输入一个奇数,产生一个魔方阵的相关文章

n阶魔方阵(奇数阵)的输出

需求 要求输出1~n2的自然数构成的魔方阵. STEP 1 什么是魔方阵? 魔方阵,古代又称"纵横图",是指组成元素为自然数1.2-n2的平方的n×n的方阵,其中每个元素值都不相等,且每行.每列以及主.副对角线上各n个元素之和都相等. STEP 2 魔方阵的规律是什么? 此处先写简单一点的奇阶魔方阵,偶数阶的算法更复杂,暂不讨论. 奇阶魔方阵的排列方法: ⑴将1放在第一行中间一列: ⑵从2开始直到n×n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1: ⑶如果上

shell 整理(26)===大小写字母替换和随机取出一个奇数

(一)题目: 接受一个输入,如果是大写字母换成小写字母,小写字母换成大写字母. 例如: [[email protected] hushuai]# bash 4.sh input:dinGXUE DINgxue [[email protected] hushuai]# 方法(1) shell 代码如下: #!/bin/bash read -p "input:" dd echo $dd | tr '[a-z][A-Z]' '[A-Z][a-z]' ~ 方法(2) shell 代码如下: #

[算法]奇数下标都是奇数或偶数下标都是偶数

题目: 给定一个长度不小于2的数组arr,实现一个函数调整arr,要么使所有的偶数下标都是偶数,要么使所有的奇数下标都是奇数. 要求:时间复杂度为O(N),额外空间复杂度为O(1). 程序: public static void modify(int[] arr) { if (arr == null || arr.length < 2) { return; } int even = 0; int odd = 1; int end = arr.length - 1; while (even <=

输入 一个日期 和一个整数 n,输出从该日期起经过n天以后的日期

假定输入的日期和天数合法正确. 这道题挺费力的,想了很久.我的想法是:按照年,月,日依次来减少n的数量,直到得出结果.假定输入的日期为2013年5月3日,n为722天. 首先先判断n能不能让2013年跑完,如果能,则n = n - 2013年剩下的天数 - 1.则日期到了2014年1月1日,然后再判断剩下的n能不能让2014年跑完(注意是否闰年的问题).直到n不足够让某年跑完,然后再让某年一个月一个月的跑,最后到不足跑完一个月,最后直接用当前的日期加上剩下的天数即可. 整个程序写下来要注意各种边

输入5个学生的名字(英文),使用冒泡排序按从大到小排序。 提示:涉及到字符串数组,一个字符串是一个一维字符数组;一个 字符串数组就是一个二维字符数组。

#include <stdio.h>#include <string.h> /*输入5个学生的名字(英文),使用冒泡排序按从大到小排序.提示:涉及到字符串数组,一个字符串是一个一维字符数组:一个字符串数组就是一个二维字符数组.*/ void main(){ char stuNames[5][100]; char tmp[100]; int i = 0,j = 0; for(i = 0; i < 5; i++) { printf("请输入第%d个学生的名字:"

华为oj-判断输入的字符串是不是一个有效的IP地址

题目标题: 判断输入的字符串是不是一个有效的IP地址 详细描述: 请实现如下接口 boolisIPAddressValid(constchar* pszIPAddr) 输入:pszIPAddr 字符串 输出:true 有效的IP地址,false,无效的IP地址 约束 输入IP为XXX.XXX.XXX.XXX格式 字符串两端含有空格认为是合法IP 字符串中间含有空格认为是不合法IP 类似于 01.1.1.1, 1.02.3.4  IP子段以0开头为不合法IP 子段为单个0 认为是合法IP,0.0.

spoj10606 数位dp (求出现的数字,所有偶数出现奇数次,所有奇数出现偶数次)

http://www.spoj.com/problems/BALNUM/ SPOJ Problem Set (classical) 10606. Balanced Numbers Problem code: BALNUM Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a balanced number if: 1)      Every even 

c#编程:任意输入星期几的一个字母来判断一下是星期几

//任意输入星期几的一个字母来判断一下是星期几,如不能判断,则再继续输入下一个字母,如再不能, //再输入下一个字母,直到能判断出为止,并统计到能判断时输入的字母的个数. <pre name="code" class="csharp">using System; using System.Collections.Generic; using System.Linq; using System.Text; //任意输入星期几的一个字母来判断一下是星期几,如

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置)。小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界)。大反派超超想去捕捉可爱的小易,他手里有n个陷阱。第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉。你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易。 输入描述: 第一行为一个整数n

有一片1000*1000的草地,小易初始站在(1,1)(最左上角的位置).小易在每一秒会横向或者纵向移动到相邻的草地上吃草(小易不会走出边界).大反派超超想去捕捉可爱的小易,他手里有n个陷阱.第i个陷阱被安置在横坐标为xi ,纵坐标为yi 的位置上,小易一旦走入一个陷阱,将会被超超捕捉.你为了去解救小易,需要知道小易最少多少秒可能会走入一个陷阱,从而提前解救小易. 输入描述: 第一行为一个整数n(n ≤ 1000),表示超超一共拥有n个陷阱. 第二行有n个整数xi,表示第i个陷阱的横坐标 第三行