这道题在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;
}
}
[code="java"]public class Test {
static int n = 10;
static int[][] arr = new int[n][n];
public static void main(String[] args) {
int x = 0, y = 0;
for (int i = 1; i <= n * n; i++) {
arr[x][y] = i;
if (canSet(x + 1, y) && !canSet(x, y - 1)) {
x = x + 1;
} else if (canSet(x, y + 1) && !canSet(x + 1, y)) {
y = y + 1;
} else if (canSet(x - 1, y) && !canSet(x, y + 1)) {
x = x - 1;
} else if (canSet(x, y - 1) && !canSet(x - 1, y)) {
y = y - 1;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(arr[j][i] + " ");
}
System.out.println("");
}
}
private static boolean canSet(int x, int y) {
if (x < 0 || y < 0 || x >= n || y >= n)
return false;
if (arr[x][y] != 0)
return false;
return true;
}
}[/code]