这道题在javaeye上好像见过, 估计是一家公司的面试. 呵呵.
题目要求输入一个大于1的数字, 按顺时针转圈圈打印数字, 打印的数字范围从1到这个数字的平方, 本人苦思半天做了出来, 面试的说代码太长了. 求更简单方法.
如输入数字5, 则打印如下形式的数字
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
如输入数字6, 则打印如下形式的数字
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
本人苦思半个多小时的代码, 其中grid的值就是那个输入的数字
public class QuanQuan {
public static void main(String[] args) {
int grid = 6;
int min = 0;
int max = grid -1 - min;
int[][] datas = new int[grid][grid];
int first = 1;
while(true) {
first = printRowFromMinToMax(min, max, min, first, datas);
first = printColFromMinToMax(min, max, max, first, datas);
first = printRowFromMaxToMin(min, max, max, first, datas);
first = printColFromMaxToMin(min, max, min, first, datas);
min = min + 1;
max = grid - 1 - min;
if (min == max) {
datas[min][max] = first;
break;
}
if (min > max) {
break;
}
}
for (int[] data:datas){
for (int d:data) {
System.out.print(d + "\t");
}
System.out.println();
}
}
public static int printRowFromMinToMax(int minCol, int maxCol, int row, int first, int[][] datas) {
for (int col=minCol; col<maxCol; col++) {
datas[row][col] = first;
first++;
}
return first;
}
public static int printRowFromMaxToMin(int minCol, int maxCol, int row, int first, int[][] datas) {
for (int col=maxCol; col>minCol; col--) {
datas[row][col] = first;
first++;
}
return first;
}
public static int printColFromMinToMax(int minRow, int maxRow, int col, int first, int[][] datas) {
for (int row=minRow; row<maxRow; row++) {
datas[row][col] = first;
first++;
}
return first;
}
public static int printColFromMaxToMin(int minRow, int maxRow, int col, int first, int[][] datas) {
for (int row=maxRow; row>minRow; row--) {
datas[row][col] = first;
first++;
}
return first;
}
}