黑马程序员技术交流社区
标题:
写一方法,打印等长的二维数组,要求从1开始的自然数由...
[打印本页]
作者:
新火燎塬521
时间:
2015-11-11 21:31
标题:
写一方法,打印等长的二维数组,要求从1开始的自然数由...
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。如: n = 4 则打印:
1
2
3
4
12
13
14
5
11
16
15
6
10
9
8
7
public class Test9 {
static int cnt=0;
static int[][] i = null;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入要打印的等长二维数组长度");
int nextInt = sc.nextInt();
if (nextInt > 0) {
i=new int[nextInt][nextInt];
shuzu(i,0,nextInt);
} else {
System.out.println("请重新输入");
}
for (int k = 0; k < nextInt; k++) {
for (int j = 0; j < nextInt; j++) {
System.out.print(i[k][j]+"\t");
}
System.out.println();
}
}
public static void shuzu(int[][] i, int start,int end) {
if(end-start==1)
{
i[start][end-1]=++cnt;
return;
}
if(start==end)
return;
for (int j = start; j < end-1; j++) {
i[start][j]=++cnt;
}
for (int j = start; j < end-1; j++) {
i[j][end-1]=++cnt;
}
for (int j = end-1; j >start; j--) {
i[end-1][j]=++cnt;
}
for (int j = end-1; j >start; j--) {
i[j][start]=++cnt;
}
shuzu(i,start+1,end-1);
}
}
复制代码
试着做了做了一下,感觉挺有意思的!希望多批评指点!
作者:
New灬狼
时间:
2015-11-11 22:02
目前基础还不够,看的迷迷糊糊的.我先回去学学基础去.
作者:
mandoooo
时间:
2015-11-11 22:32
有注释更好了
作者:
小笨笨天
时间:
2015-11-12 00:49
看着晕晕
作者:
新火燎塬521
时间:
2015-11-12 09:01
看看这个呗
example.png
(143.51 KB, 下载次数: 1)
下载附件
2015-11-12 09:00 上传
作者:
li3N
时间:
2015-11-12 09:47
我来个非递归版的。也不知道为什么,自己做题的话基本写不到递归上去……
package com.itheima;
/**
* 9.写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
* 如: n = 4 则打印:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
* 分析:
* (1)整个螺旋可以分为多个圈。可以算出这个圈数,从外到里分别为第0,1,2,……圈;
* (2)每圈螺旋可以拆分为首尾相接的上端、右端、下端、左端四条线路;
* (3)因此大致框架是两层循环,外层循环是螺旋圈数,内层循环由4个串联的循环组成,分别表示四条线路。
* @author Administrator
*
*/
public class Test9 {
// 在主函数中定义要打印长度为多少的螺旋排列数组并调用打印方法
public static void main(String[] args) {
int n = 9;
showHelixArray(n);
}
// 打印螺旋排列数组的方法,形参为二维数组的长度
public static void showHelixArray(int size) {
// 创建二维数组
int[][] arr = new int[size][size];
// 计算螺旋圈数
int circlecount = (size % 2 == 0 ? size / 2 : size / 2 + 1);
// 获取每一圈有多少个数字,并存放在一个数组中
int[] numbercounts = new int[circlecount];
for (int i = 0; i < circlecount; i++) {
int numbercount;
if (i != circlecount - 1) {
numbercount = (size - 1 - 2 * i) * 4;
} else {
numbercount = (size % 2 == 0 ? (size - 1 - 2 * i) * 4 : 1);
}
numbercounts[i] = numbercount;
}
// 获取每一圈数字的起始索引,并存放在一个数组中
int[] index = new int[circlecount];
for (int i = 0; i < circlecount; i++) {
int startindex = 1;
for (int j = 0; j < i; j++) {
startindex = startindex + numbercounts[j];
}
index[i] = startindex;
}
// 向二维数组中按螺旋顺序添加数字
for (int i = 0; i < circlecount; i++) {
// 获取这一圈的数字起始索引
int startindex = index[i];
// 定义从起始索引开始的指针,通过指针向数组中添加数字
int pointer = startindex;
// 获取上下左右四条添加线路的位置极限(右边界或下边界)
int limit = (numbercounts[i] == 1 ? 1 : numbercounts[i] / 4) + i;
// 向上端线路中添加数字
for (int j = i; j < limit; j++) {
arr[i][j] = pointer++;
}
// 如果最后一圈只有一个数字,则只需要走上端线路,其他情况需要四条线路依次走一遍
if (numbercounts[i] != 1) {
// 向右端线路中添加数字
for (int j = i; j < limit; j++) {
arr[j][limit] = pointer++;
}
// 向下端线路中添加数字(反向)
for (int j = limit - 1; j >= i; j--) {
arr[limit][j + 1] = pointer++;
}
// 向左端线路中添加数字(反向)
for (int j = limit - 1; j >= i; j--) {
arr[j + 1][i] = pointer++;
}
}
}
// 添加完毕后,打印二维数组
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}
复制代码
作者:
zzy1990
时间:
2015-11-12 10:23
学习了,谢谢分享
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2