|
第一种办法
1 import java.text.DecimalFormat;
2
3 public class HelixMatrix {
4 private int[][] array;
5 private int m,n;
6 public HelixMatrix(int m, int n) {
7 this.m = m;
8 this.n = n;
9 array = new int[m][];
10 for(int i = 0; i < m; i++)
11 array[i] = new int[n];
12 }
13
14 private void fill() {
15 int count = m * n;
16 int direct = 0;
17 int round = 1;
18 for(int index = 1, x = 0, y = 0; index <= count; index++) {
19 array[x][y] = index;
20 switch(direct) {
21 case 0: //向右
22 if(y < n - round)
23 y++;
24 else {
25 direct = 1;
26 x++;
27 }
28 break;
29 case 1:
30 if(x < m - round)
31 x++;
32 else {
33 direct = 2;
34 y--;
35 }
36 break;
37 case 2:
38 if(y >= round)
39 y--;
40 else {
41 direct = 3;
42 x--;
43 }
44 break;
45 case 3:
46 if(x > round)
47 x--;
48 else {
49 direct = 0;
50 round++;
51 y++;
52 }
53 break;
54 }
55 }
56 }
57
58 private void printMatrix() {
59 DecimalFormat df = new DecimalFormat(" 000");
60 for(int i = 0; i < m; i++) {
61 for(int j = 0; j < n; j++)
62 System.out.print(df.format(array[i][j]));
63 System.out.println();
64 }
65 }
66
67 public static void main(String[] args) {
68 HelixMatrix matrix = new HelixMatrix(8,6);
69 matrix.fill();
70 matrix.printMatrix();
71 }
72 }
第二种办法
1 public class ScrewSquare {
2
3 public static void main(String[] args) {
4 int w = 5;
5 int h = 5;
6 int[][] array = new int[w][h];
7 fill(array, 0, 0, w-1, h-1, 1);
8 for (int y=0; y<h; y++) {
9 for (int x=0; x<w; x++) {
10 System.out.printf("%2d ", array[x][y]);
11 }
12 System.out.println();
13 }
14 }
15
16 public static void fill(int[][] array, int left, int top, int right, int bottom, int start) {
17 if (left > right || top > bottom) return;
18
19 for (int x=left; x<=right; x++)
20 array[x][top] = start++;
21
22 for (int y=top+1; y<=bottom; y++)
23 array[right][y] = start++;
24
25 for (int x=right-1; x>=left; x--)
26 array[x][bottom] = start++;
27
28 for (int y=bottom-1; y>=top+1; y--)
29 array[left][y] = start++;
30
31 fill(array, left+1, top+1, right-1, bottom-1, start);
32 }
33 }
|