`
yaoweijq
  • 浏览: 785 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

蛇形矩阵的一点思考

阅读更多

昨天看到一个关于蛇形矩阵的帖子,

想了下如何一行一行打印,

无须建立二维数组存储。

基本思想如下:

把这个输出的二维数组从外到里分解为多层

每层都是一个正方形的边

从外到里称为1,2,3...层

对于一个指定维数(行=列)的二维数组,

其中某个位置的元素(x,y)

首先根据x,y计算出这个位置所在的层数,

然后根据层数计算出这层左上角元素的值,

(这个元素的位置必然是(层数-1,层数-1))

最后根据x,y计算出它相当于本层左上角元素的偏移量,

二者相加,就是(x,y)的值.

下面附上代码,欢迎大家拍砖。

程序比较粗糙,主要是算法实现,

package com.yaowei.algorithm;

public class SnakeMatrix {
	//存储结果的二维数组
	private int[][] data;
	//二维数组的维数
	private int index;
	//0 右 1 下 2 左 3 上
	private int direct;
	public static void main(String[]args){
		SnakeMatrix s = new SnakeMatrix(10);
		s.print();
	}
	public SnakeMatrix(int i){
		if(i<1){
			System.out.println("参数错误");
			System.exit(0);
		}
		index = i;
		data = new int[i][i];
		for(int j=0;j<i;j++){
			for(int k=0;k<i;k++){
				data[j][k] = 0;
			}
		}
		direct = 0;
		//manageData();
		manageDataByMath();
		
	}
	/**
	 * 直接根据二维数组的x,y值来计算这个位置的元素值
	 * 一圈为一层,从外到内分别为1,2,3...层
	 * 首先得到这个位置元素的层数
	 * 然后计算这层左上角元素的值
	 * 再计算出这个位置(x,y)相对于左上角元素的偏移量
	 * 二者相加,就是这个位置的元素值
	 */
	public void manageDataByMath(){
		for(int i=0;i<index;i++){
			for(int j=0;j<index;j++){
				data[i][j] = getDataByPosition(i,j);
			}
		}
		
	}
	/**
	 * 数组被分为四个部分,
	 * 只看左上部分,
	 * (x,y)位置x,y的较小值就标明了这个位置的层数
	 * 其他三个部分与左上部分是对称的
	 * 映射一下关系就行了
	 * @param i
	 * @param j
	 * @return
	 */
	public int getLevByPosition(int i,int j){
		int mid = (int)index/2;
		int tempi,tempj;
		if((i+1)>mid){
			tempi = index-i-1;
		}else{
			tempi = i;
		}
		if((j+1)>mid){
			tempj = index-j-1;
		}else{
			tempj = j;
		}
		if(tempi<tempj) return tempi+1;
		return tempj+1;
	}
	/**
	 * 计算本层左上角的元素值
	 * @param i
	 * @param j
	 * @return
	 */
	public int getDataByPosition(int i,int j){
		int lev = getLevByPosition(i,j);
		//每一层左上角第一个元素的值
		int startIndex = 0;
		//计算这个值
		for(int temp=1;temp<lev;temp++){
			startIndex +=((index-2*temp)*4+4);
		}
		return startIndex+getAdd(i,j,lev)+1; 
	}
	/**
	 * 得到偏移量
	 * @param i
	 * @param j
	 * @param lev
	 * @return
	 */
	public int getAdd(int i,int j,int lev){
		int add = 0;
		//每一层的边长
		int levEdge = index-2*(lev-1);
		
		if(i+1 == (index-(lev-1))){
			//这一层的倒数第一行
			add = 2*levEdge-1+(index-lev-1-j);
		}else if(i+1 == lev){
			//这一层的第一行
			add = j-lev+1;
		}else{//中间行
			if(j>((int)index/2)){
				add = levEdge + i-lev;
			}else{
				add = levEdge + levEdge-2 +levEdge+(index-lev-i-1);
			}
		}
		return add;
	}
	private void changeDirect(){
		direct = (direct+1)%4;
	}
	//根据前进方向(direct)判断前方的二维数组元素是否没有赋值
	private boolean check(int j,int k){
		if(direct ==0){
			if((k+1)==index){
				return false;
			}else if(data[j][k+1]!=0){
				return false;
			}
		}else if(direct == 1){
			if((j+1)==index){
				return false;
			}else if(data[j+1][k]!=0){
				return false;
			}
		}else if(direct == 2){
			if(k==0){
				return false;
			}else if(data[j][k-1]!=0){
				return false;
			}
		}else{
			if(j==0){
				return false;
			}else if(data[j-1][k]!=0){
				return false;
			}
		}
		return true;
	}
	/**
	 * 直接根据蛇形的前进方向一个一个置二维数组的值
	 */
	public void manageData(){
		int j = 0;
		int k = 0;
		data[j][k] = 1;
		for(int i=2;i<index*index+1;i++){
			//判断能否合法赋值
			while(!check(j,k)){
				changeDirect();
			}
			if(direct == 0){
				k++;
			}else if(direct == 1){
				j++;
			}else if(direct == 2){
				k--;
			}else{
				j--;
			}
			data[j][k] = i;
		}

	}
	//仅供参考,数据大了会连在一起
	public void print(){
		for(int i = 0;i<index;i++){
			for(int j = 0;j<index;j++){
				if(data[i][j]<10){
					System.out.print("   "+data[i][j]);
				}else if(data[i][j]>99){
					System.out.print(" "+data[i][j]);
				}
				else{
					System.out.print("  "+data[i][j]);
				}
			}
			System.out.println();
		}
	}

}

 

里面包括了从外到内初始化数组的方法及直接计算某位置值的方法。

分享到:
评论

相关推荐

    蛇形矩阵(用二元数组实现)

    在编程领域,特别是在学习数组和循环结构时,蛇形矩阵是一个经典的练习题目,因为它涉及到对数组的高效操作和逻辑思考。 在C++中实现蛇形矩阵,通常会用到二维数组(二元数组)。下面将详细解释其原理和实现步骤: ...

    C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵

    C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之蛇形矩阵C++之...

    使用二维数组和双重循环打印蛇形矩阵

    使用二维数组和双重循环打印蛇形矩阵使用二维数组和双重循环打印蛇形矩阵使用二维数组和双重循环打印蛇形矩阵

    c++蛇形矩阵

    以前用c++写的一个蛇形矩阵

    java 蛇形矩阵 最简单的 初学者用

    java 蛇形矩阵 最简单的 初学者用

    蛇形矩阵 C++ 源代码

    用C++写的一个蛇形矩阵,当输入一个整数n(10&gt;=n&gt;=1)时,输出大小为n行n列的蛇形矩阵。

    蛇形矩阵递归算法

    蛇形矩阵递归算法,通过简单地递归实现蛇形矩阵的输出

    蛇形矩阵c++程序(数值排列)

    蛇形矩阵,也被称为“螺旋矩阵”,是一种特殊的二维数组,其元素按照螺旋形状填充。在C++编程中,实现蛇形矩阵通常涉及到数组操作、循环控制以及条件判断。以下是对这个话题的详细解释: 首先,我们需要理解蛇形...

    N阶蛇形矩阵生成(java)

    生成一个n阶的蛇形矩阵的java程序 输入矩阵宽度n生成宽度为n的递增的蛇形矩阵

    蛇形矩阵的源代码

    蛇形矩阵的源代码,自己写的……不对的地方还望指教

    蛇形矩阵(Java实现代码)

    因此输出的形状,像条蛇,因此称为蛇形矩阵.

    c++练习题蛇形矩阵

    c++练习题蛇形矩阵

    逆时针蛇形矩阵问题

    逆时针蛇形矩阵是一种特殊的二维数组排列方式,它的特点是元素按照从左上角开始,先向右走,然后向下,接着向左,最后向上,如此反复,形成一个逆时针方向的“S”形路径。在C语言中实现这个功能,需要对数组操作和...

    解题训练 蛇形矩阵.doc

    【蛇形矩阵】是一种特殊的矩阵填充方式,通常用于编程题目中。它的特点是按照蛇的爬行路径填充数字,从左上角开始,先向右,然后向下,再向左,接着向上,如此反复,直到填满整个正方形矩阵。题目要求输入矩阵的边长...

    Oldx_fly_controller-蛇形矩阵

    Star 蛇形矩阵 蛇形矩阵 蛇形矩阵 蛇形矩阵 蛇形矩阵

    c语言版蛇形矩阵实现

    蛇形矩阵的实现的经典案例for(i=1;i;i++)/*对副对角线上三角端点赋值*/ { k=k+i; if(i%2==1) { a[0][i]=k; a[i][0]=k+i; } else { a[i][0]=k; a[0][i]=k+i; } }

    螺旋蛇形矩阵

    螺旋蛇形矩阵是一种特殊的二维数组布局,它按照特定的规则填充数字。在这个程序中,我们看到的是一个逆时针方向的填充值排列。通常,这种矩阵的填充方式是从左上角开始,按照顺时针或逆时针方向螺旋式地填充数字。在...

    蓝桥杯-蛇形矩阵题解.zip

    蓝桥杯—蛇形矩阵题解.zip 是一个压缩文件,包含了关于蛇形矩阵问题的详细题解和代码实现。该资源旨在帮助参加蓝桥杯竞赛的选手更好地理解蛇形矩阵问题,并提供相应的解决方案和代码示例。 内容概要: 该压缩文件...

    数据结构与算法:蛇形矩阵的构建及其应用场景

    内容概要:本文详细介绍了两种主要的蛇形矩阵——水平蛇形矩阵和斜向蛇形矩阵的定义、构造方法以及具体的Python实现代码。水平蛇形矩阵按照行方向交替填充数字,而斜向蛇形矩阵则按照对角线方向填充形成Z字形路径。...

    蛇形矩阵算法

    蛇形矩阵,也被称为“螺旋矩阵”,是一种特殊的二维数组布局方式,它的特点是元素按照类似蛇行的方式填充。这种矩阵在编程挑战、数据存储以及解决某些特定问题时具有应用价值。接下来,我们将深入探讨三种实现蛇形...

Global site tag (gtag.js) - Google Analytics