`
MouseLearnJava
  • 浏览: 466344 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

连续数字的旋转二维数组

    博客分类:
  • Java
阅读更多
生成一个连续数字的旋转二维数组,起始位置位于左上角,然后从起始位置开始递增,按照顺时针或者逆时针从外向里将连续的数组存入二维数组中,并输出生成的旋转二维数组。

/**
 * 
 * <code>ConvolutionalArray</code>主要是用来输出一个旋转式样的二维数组。
 * 
 * 
 * 此二维数组由连续的数字组成,比如:
 *  * 
 * int i=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  
 
 * int i=6  
 * 1  2  3  4  5   6  
 * 20 21 22 23 24  7  
 * 19 32 33 34 25  8  
 * 18 31 36 35 26  9  
 * 17 30 29 28 27 10  
 * 16 15 14 13 12 11  
 * 

 * 
 * @author Eric
 * @version 1.0
 * 
 */

public class ConvolutionalArray {

	private static final int DEFAULT_NUMBER = 5;

	// 定义连续数字添加的方向
	private enum Direction {
		Right, Down, Left, Up;
	}

	// 保存当前处理的方向,默认一开始是向右的。
	private Direction currentDirection = Direction.Right;

	// 将一个二维数组看成X, Y两个方向,记录下,最小的X,Y值以及最大的X,Y
	private int minX = 0;

	private int minY = 0;

	private int maxX = DEFAULT_NUMBER - 1;

	private int maxY = DEFAULT_NUMBER - 1;

	private int currentCount = 0;

	/**
	 * 打印数组。
	 * 
	 * @param expectedNumber :
	 *            期望的二维数组每行显示的个数。
	 */
	public void printArray(int expectedNumber) {
		int[][] array = buildArray(expectedNumber);
		printArray(array, expectedNumber);
	}

	/**
	 * 
	 * @param expectedNumber:
	 *            期望的二维数组每行显示的个数。
	 * @return: 返回一个连续数字组成的二维数组。
	 */
	private int[][] buildArray(int expectedNumber) {
		int[][] result = new int[expectedNumber][expectedNumber];
		// Total number of numeric values
		int count = expectedNumber * expectedNumber;
		// Reset max value for maxX and maxY.
		maxY = expectedNumber - 1;
		maxX = expectedNumber - 1;
		/*
		 * 如果要生成一个nxn的二维数组,那么里面的最大数应该是n*n, 当处理的数字还没有达到这个最大值,一直循环处理下去。
		 * 
		 */
		while (currentCount < count) {
			/*
			 * 因为开始默认的方向是Right,也就是顺时针方向,所以,处理的顺序是 Right -> Down -> Left -> Up
			 * ->Right ... 每次一个方向填充值之后,需要先判断当前数据是否达到最大值。
			 */
			if (currentCount < count) {
				processRight(result);
			}
			if (currentCount < count) {
				processDown(result);
			}
			if (currentCount < count) {
				processLeft(result);
			}
			if (currentCount < count) {
				processUp(result);
			}
		}
		return result;
	}

	/**
	 * 向右方向填充数据。
	 */
	private void processRight(int[][] currentArray) {
		for (int i = minX; i <= maxX; i++) {
			currentArray[minY][i] = ++currentCount;
		}
		changeDirection();
		minY++;
	}

	/**
	 * 向下方向填充数据。
	 */
	private void processDown(int[][] currentArray) {
		for (int i = minY; i <= maxY; i++) {
			currentArray[i][maxX] = ++currentCount;
		}
		changeDirection();
		maxX--;
	}

	/**
	 * 向左方向填充数据。
	 */
	private void processLeft(int[][] currentArray) {
		for (int i = maxX; i >= minX; i--) {
			currentArray[maxY][i] = ++currentCount;
		}
		changeDirection();
		maxY--;
	}

	/**
	 * 向上方向填充数据。
	 */
	private void processUp(int[][] currentArray) {
		for (int i = maxY; i >= minY; i--) {
			currentArray[i][minX] = ++currentCount;
		}
		changeDirection();
		minX++;
	}

	/**
	 * 打印二维数组的内容。
	 * 
	 * @param array
	 * @param expectedNumber
	 */
	private void printArray(int[][] array, int expectedNumber) {
		for (int i = 0; i < expectedNumber; i++) {
			for (int j = 0; j < expectedNumber; j++) {
				System.out.print(appendSpace(array[i][j], expectedNumber));
			}
			System.out.println();
		}
	}

	/**
	 * 为了保证数据输出时能够对齐,添加一些空格.
	 */
	private String appendSpace(int value, int expectedNumber) {
		int maxValue = expectedNumber * expectedNumber;
		int maxLength = String.valueOf(maxValue).length();
		int currentValueLength = String.valueOf(value).length();
		StringBuilder sb = new StringBuilder();
		sb.append(value);
		for (int i = maxLength; i > currentValueLength; i--) {
			sb.append(" ");
		}
		sb.append(" ");
		return sb.toString();
	}

	/**
	 * 改变当前的方向。
	 */
	private void changeDirection() {
		switch (currentDirection) {
		case Right:
			currentDirection = Direction.Down;
			break;
		case Down:
			currentDirection = Direction.Left;
			break;
		case Left:
			currentDirection = Direction.Up;
			break;
		case Up:
			currentDirection = Direction.Right;
			break;
		}
	}

	/**
	  * 在一个二维数组基础上,以对角线为对称线,实现两侧数据的交换,并返回这个交换数据后的二维数组。
	  * 
	  * 这样做有一个用处:比如已经有一个向右的二维旋转数组(向右):
	  *  
	  1  2  3  4  
	  12 13 14 5  
	  11 16 15 6  
	  10 9  8  7  
	  采用此方法之后,可以得到一个向下方向的二维旋转数组(向下)
	  1  12 11 10 
	  2  13 16 9  
	  3  14 15 8  
	  4  5  6  7  
	  */
	private int[][] exchangeArray(int[][] originalArray, int expectedNumber) {
		int[][] exchangedArray = new int[expectedNumber][expectedNumber];
		for (int i = 0; i < expectedNumber; i++) {
			for (int j = 0; j < expectedNumber; j++) {
				exchangedArray[i][j] = originalArray[j][i];
			}
		}
		return exchangedArray;
	}

	/**
	 * 打印交换数据后的二维数组。
	 */
	public void printExchangedArray(int expectedNumber) {
		int[][] array = buildArray(expectedNumber);
		printArray(exchangeArray(array, expectedNumber), expectedNumber);
	}
}


测试代码:

public class Test {
	public static void main(String[] args) {
		for (int i = 5; i < 11; i++) {
			System.out.println("Direction: Right; int = " + i);
			new ConvolutionalArray().printArray(i);
			System.out.println();
			System.out.println("Direction: Down; int = " + i);
			new ConvolutionalArray().printExchangedArray(i);
			System.out.println();
		}
	}
}


输出结果:








下面在显示一个大小为34*34的旋转二维数组:




  • 大小: 30.7 KB
  • 大小: 37.2 KB
  • 大小: 39.5 KB
  • 大小: 248 KB
  • 大小: 248.2 KB
0
6
分享到:
评论

相关推荐

    leetcode二维数组-programming_exercises:leetcode、nowcoder刷题之路

    leetcode二维数组 编程练习 包含常见的编程网站的练习习题(leetcode、牛客等)----待完成中... 也同时包含复习面试的编程练习 该src/main/java目录下,以文件夹命名,表示的是不同的来源 每个文件均可单独运行 其他...

    C语言15个必背的经典程序

    - **二维数组**: 使用二维数组来存储原始数据和旋转后的数据。 - **循环嵌套**: 使用两层`for`循环来读取和旋转数据。 - **输出格式控制**: 控制输出格式,使得数据以4行4列的形式展示。 - **代码分析**: - 创建...

    各种经典的LabVIEW实例(50个).rar

    读取二维数组所有数据 调用C-动态数据库 贪食蛇 这个程序演示利用队列来实现数据的传引用 远程开启VI 连续写入文件 键盘控制TAB控件 黑白棋程序 Excel相关 Google_Earth和LV labview8.6如你所愿 labview8.6自动连接...

    erpang.rar_C矩阵旋转_ERPANG_矩阵旋转_绕轴旋转 矩阵

    在C语言中,矩阵运算通常通过二维数组实现。要进行矩阵旋转,首先需要定义一个函数,接受原始矩阵、旋转轴和旋转角度作为参数。然后根据旋转类型,利用旋转公式更新矩阵元素。最后,返回旋转后的矩阵。 4. **...

    算法题总结 2741

    25. **二维数组中的查找**:二维数组的查找通常涉及到行优先或列优先遍历,根据具体问题选择合适策略。 这些题目覆盖了算法的多个方面,通过它们可以提高逻辑思维能力和编程技巧,对于准备面试和提升编程能力非常有...

    数字图像处理 冈萨雷斯 第三版 第二章图片_原版

    4. **图像的表示**:图像可以用一维数组(行优先或列优先)或二维数组(矩阵形式)来表示。对于彩色图像,每个像素通常由红、绿、蓝三个分量表示。 5. **图像的基本操作**:包括平移、旋转、缩放等几何变换,以及...

    java小游戏集合

    - **数组标记**:使用二维数组记录每个格子的状态(数字、雷、未知)。 - **邻接计算**:找出每个格子周围的雷数,这需要邻接矩阵或邻接表。 - **点击事件**:处理用户的点击操作,包括翻开格子、标记雷区。 - *...

    (一)剑指offer—Python版—数组篇

    在一个每行按从左到右递增、每列按从上到下递增排列的二维数组中,我们需要编写一个函数来判断是否存在特定的整数。这个问题可以通过双指针方法解决,分别控制行指针(r1, r2)和列指针(c1, c2),根据目标值与...

    76道C或C++入门必做的编程题

    - 二维数组:使用二维数组存储矩阵数据。 - 矩阵旋转:理解如何实现矩阵的旋转操作。 - 数据输出:学习如何按行列顺序输出二维数组中的数据。 ### 5. 十进制转其他进制 #### 题目描述: 编写一个程序,将一个十进制...

    旋转LED立体平面显示字程序.zip_旋转LED_旋转立体显示_立体led_立体旋转led_立体显示

    这些模式可以是二维数组,每个元素代表一个LED的状态。当需要显示某个字符时,程序会按照预设的模式控制LED阵列的亮灭。 然后,涉及到的是定时器和中断服务函数的使用。为了实现动态显示,程序需要精确地控制LED的...

    Java面试 Java超级经典100问题 Java高级开发工程师必备 Java面试宝典

    二维数组中查找目标值、4.替换字符串中的空格。5.从尾到头打印链表.6.由前序和中序遍历重建二叉树.7.用两个栈实现队列8.求旋转数组的最小数字、9.斐波那契数列的第n项(青蛙跳台阶)10.二进制中1的个数、11.数值的整数...

    数字图像处理讲义朱志刚

    2. 图像表示:图像通常用二维数组表示,数组中的每个元素称为像素,其值代表该位置的亮度或颜色强度。 二、图像数字化 1. 扫描与采样:将连续图像转换为离散图像的过程称为扫描,通过在空间上设置采样点来实现。 2...

    数字图像处理Kenneth R.Castleman

    图像可以视为二维数组,其中每个元素(像素)都有一个数值,代表该位置的颜色或亮度信息。图像的表示方式包括灰度图像、彩色图像(如RGB模型)以及索引颜色图像等。图像的数字化过程包括采样和量化,这两个步骤将...

    数字图像处理计算机辅助教学教案

    在计算机中,图像以二维数组的形式存储,便于进行各种计算操作。 图像变换是数字图像处理的重要一环,它涉及图像的位置、尺度、角度和形状改变。常见的图像变换有平移、旋转、缩放、剪切等。例如,傅立叶变换是一种...

    行主序和列主序矩阵的演示

    "行主序"和"列主序"是指存储和处理二维数组,尤其是矩阵时采用的不同策略。这两种方式主要应用于线性代数和图形编程,有助于提高运算效率。 首先,我们要理解什么是矩阵。矩阵是一个由有序元素(通常是数字)构成的...

    数字图像处理教案

    1. 图像像素:图像的基本组成单元,通常用二维数组表示。 2. 灰度级:灰度图像中的每个像素用一个整数或浮点数表示其亮度级别。 3. 颜色空间:RGB、HSV、YCbCr等,它们提供了不同的方式来表示彩色图像。 四、图像...

    冈萨雷斯数字图像处理第三版书中图片

    1. **图像基础知识**:在第一章,作者介绍了图像的基本概念,包括图像的类型(如灰度图像、彩色图像)、像素的概念、图像的表示方法(如一维数组、二维数组)以及图像的几何属性(如分辨率、尺寸)。 2. **图像数字...

    数字图像处理(MATLAB版)冈萨雷斯第二版

    1. 图像基础知识:包括图像的类型(如灰度图像、彩色图像)、像素的概念、图像的表示方法(如二维数组、像素强度值)以及图像的几何属性(如分辨率、尺寸)。 2. 图像的数字化:涉及图像采样和量化,这两个过程是将...

    编程题刷的题库

    可能涉及到的知识点有:二维数组,欧几里得距离,线性代数基础。 2. **华为 - 旋转蛇形矩阵.c** 这是一个经典的矩阵操作问题,通常要求按照“之”字形顺序填充或打印矩阵。涉及的知识点包括:多维数组的操作,循环...

Global site tag (gtag.js) - Google Analytics