黑马程序员技术交流社区
标题:
一道题
[打印本页]
作者:
小面团
时间:
2016-8-3 20:28
标题:
一道题
写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。
* 如: n = 4 则打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
?
作者:
xueyezhishi
时间:
2016-8-3 21:45
n分奇数和偶数情况。
偶数时,可以把最外层看做是一个正方形,计算数据个数的方法是2*(n+(n-2))
由外向内看,可以看做一个个的正方形,且都为顺时针递增。每减一层,数据个数则为n=n-2。
知道各种情况的数量,即可对数组进行赋值,并进行打印
作者:
xueyezhishi
时间:
2016-8-3 23:13
重新想了想,不用区分奇数和偶数。代码如下:
import java.util.Scanner;
public class Prog14{
static int n = 7;
static int num = 1;//从1开始计数
static int b[][]=new int[n][n];
public static void main(String[] args){
for(int i = n;i>0;i=i-2){
setArray(getSize(i),n,b);
}
printB();
}
public static int getSize(int n){//计算每层长度
int sum = 2*(n+(n-2));
return sum;
}
public static int getX(int side,int n){//得到当前坐标x
return (n-side)/2;
}
public static void printB(){//打印数组
for(int x =0;x < n;x++){
for(int y =0;y < n;y++){
System.out.print(b[x][y]+" ");
}
System.out.println("\n");
}
}
public static void setArray(int s,int n,int b[][]){//对数组赋值
int top = (s+4)/4;//上
int other = top -1;//右、下
int left = top -2;//左
int x = getX(other,n);//数组x
int y = x;//数组y
for(int i = 1 ;i <= top;i++){//上
b[x][y] = num;
num++;
y++;
}
y--;
for(int i = 1 ;i <= other;i++){//右
x++;
b[x][y] = num;
num++;
}
for(int i = 1 ;i <= other;i++){//下
y--;
b[x][y] = num;
num++;
}
for(int i = 1 ;i <= left;i++){//左
x--;
b[x][y] = num;
num++;
}
}
}
作者:
xueyezhishi
时间:
2016-8-3 23:15
这是效果n=7
1 2 3 4 5 6 7
24 25 26 27 28 29 8
23 40 41 42 43 30 9
22 39 48 49 44 31 10
21 38 47 46 45 32 11
20 37 36 35 34 33 12
19 18 17 16 15 14 13
n=10
1 2 3 4 5 6 7 8 9 10
36 37 38 39 40 41 42 43 44 11
35 64 65 66 67 68 69 70 45 12
34 63 84 85 86 87 88 71 46 13
33 62 83 96 97 98 89 72 47 14
32 61 82 95 100 99 90 73 48 15
31 60 81 94 93 92 91 74 49 16
30 59 80 79 78 77 76 75 50 17
29 58 57 56 55 54 53 52 51 18
28 27 26 25 24 23 22 21 20 19
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2