黑马程序员技术交流社区
标题:
求助打印螺旋数组有没有更好的办法?
[打印本页]
作者:
ysheluo
时间:
2015-4-14 10:38
标题:
求助打印螺旋数组有没有更好的办法?
/*题目9:
* 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
* 1 2 3 4
* 12 13 14 5
* 11 16 15 6
* 10 9 8 7
*思路:输入的方式是一圈接一圈,那么步骤重复可以考虑递归的方式来解决。先输入一圈,然后再递归第二圈直到完成。
*同时观察发现对称的两行对应之和相等如1+10=2+9,同样12+5=11+6,这样排出一半即可知道另一半
*发现n取奇取偶还不一样,奇数时最中心位置无法转到,应单独给出为n*n
*/
public class Test9 {
//为了能在递归中用到数组则把数组变为类中成员而不是放在方法中;
static int n=4;
static int[][] arr=new int[n][n];
public static void main(String[] args) {
method(n,1,1);
if(n%2==1){//给出当奇数时最中心位置
arr[n/2][n/2]=n*n;
}
//打印结果
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.println(arr[i][j]);
}
}
}
public static void method(int n,int start,int round){
if(round>n/2){//定义递归结束边界
}
else{
for(int i=round-1;i<n-round+1;i++){
arr[round-1][i]=start+i-round+1;
arr[n-round][i]=3*(n-2*round+1)+start-i+round-1;//用和减去对称的值
if(i==n-round){
for(int j=round;j<n-round;j++){
arr[j][i]=start+n-3*round+2+j;
arr[j][n-i-1]=start-7*round+4*n+3-j;//用和减去对称的值
}
}
}
start=4*(n-2*round+1)+start;
round++;
method(n,start,round);//递归
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2