黑马程序员技术交流社区
标题:
关于螺旋方阵打印,该方法同样适合非等边矩阵螺旋打印
[打印本页]
作者:
怪人长
时间:
2016-3-17 10:28
标题:
关于螺旋方阵打印,该方法同样适合非等边矩阵螺旋打印
本帖最后由 怪人长 于 2016-3-17 10:37 编辑
关于螺旋方阵打印问题,遇见这个问题先在稿纸上亲自模拟存放了一次方阵,由笔尖的游走为过程,所以我认为这种方法可以特别形象的描述该存放过程,并且该方法思想同样适用于非等边矩阵。下面提供我对该问题解决的分析和源代码,有什么可精简或者隐存潜在问题的地方还请广大“马”友指出来。代码仅供参考。
/**
*
* 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*/
public class Demo01 {
/*
* 需求:如题。
*
* 分析:
* 1.创建一个int类型 n行 n列的二维数组Arr;
* 2.按照自然数螺旋存放进数组的方法将自然数存到Arr中;
* 3.打印出该二维数组;
*
* 自然数螺旋存放进数组的方法思路如下:
* 按照螺旋规则遍历该 n*n的二维数组,并在遍历的过程中将自然数存放进去。设定 Arr[h][l]代表第 h行第 l列,
* 首先从Arr[0][0]位置开始向右遍历,先假设当我们遍历完一行或者一列的时候,我们把这一行或列剔除出去,剩下
* 的元素组成一个新的矩阵,这样的话,每当遍历到矩阵四个角的时候,其以后的遍历规则就是固定的,比如当遍历到右上角
* 的时候,下一次遍历一定是往下遍历并剔除第一行,到右下角后要向左遍历并剔除最右边一列,到左下角后要向上遍历并
* 剔除最下一行,如此以来,每次都是在剩下的矩阵的边缘进行遍历,当遍历完最后一个位置时结束遍历。
* 那么要解决的问题就是如何确定是否为最后一个位置呢?
* 解决方法是:由原方阵定义最小行、最大行、最小列、最大列,每遍历完一行或一列之后剔除该行或列,如遍历完第一行
* 之后就让最小行的值加1,遍历完最后一列之后就让最大列的值减1,那么当剩下最后一个位置要遍历的时候,此时的最
* 小行和最大行相等、最小列和最大列相等。
*/
public static void main(String[] args) {
int n = 10;
int[][] Arr = new int[n][n]; //定义个n*n的二维数组;
generateArray(Arr, n); //对该数组进行螺旋存放自然数生成;
print(Arr); //打印输出该二维数组;
}
//定义一个方法,用来对数组螺旋存放自然数生;
public static void generateArray(int[][] Arr, int n) {
int count = 1; //自然数;
int minh = 0; //分别为最小行、最大行、最小列、最大列;
int maxh = n-1;
int minl = 0;
int maxl = n-1;
int h = minh; //分别是要遍历的行和列;
int l = minl;
do { //因为当满足最后一个位置条件时,该位置仍要遍历,所以使用do-while语句;
if ((h == minh) && (l == minl)) { //遍历位置为最小行最小列处,即左上角
if (!((h == 0) && (l == 0))) { //判断是否是遍历的第一个位置,如果是第一个位置就直接遍历,否则就是刚遍历完最左一列,需要剔除最左列(最小列);
minl ++;
}
for (int i = minl; i <= maxl; i++) { //对向右遍历,直到当前矩阵最大列;
l = i;
Arr[h][l] = count; //每遍历一个位置,就存放自然数;
count++;
}
}else if ((h == minh) && (l == maxl)) { //遍历位置到右上角的时候;
minh ++; //去除最上行(最小行);
for (int i = minh; i <= maxh; i++) { //向下遍历;
h = i;
Arr[h][l] = count;
count ++;
}
}else if ((h == maxh) && (l == maxl)) { //遍历到右下角;
maxl --; //去除最右列(最大列);
for (int i = maxl; i >= minl; i--) { //向左遍历;
l = i;
Arr[h][l] = count;
count ++;
}
}else if ((h == maxh) && (l == minl)) { //遍历到左下角;
maxh --; //去除最下行(最大行);
for (int i = maxh; i >= minh; i--) { //向上遍历;
h = i;
Arr[h][l] = count;
count ++;
}
}
} while((maxh > minh) || (maxl > minl)); //当剩下的行数和列数都为1时,遍历该位置,结束遍历;
}
//定义一个方法,用于将传入的二维数组打印出来;
public static void print(int [][] Arr) {
for (int i = 0; i < Arr.length; i++) {
for (int j = 0; j < Arr[i].length; j++) {
System.out.print(Arr[i][j] + "\t");
}
System.out.println();
}
}
}
复制代码
作者:
怪人长
时间:
2016-3-17 10:47
我还是新人贴,求罩,求罩
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2