定义接口:
public interface ISpiralNumber { public int [][] genArray(int i,int j); }
/** * @类功能说明: 非递归方法实现 * @类修改者: * @修改日期: * @修改说明: * @作者:Administrator * @创建时间:2013-3-22 下午10:31:19 * @版本:V1.0 */ public class SpiralNumber implements ISpiralNumber { public static final int MAXSIZE = 100; @Override public int[][] genArray(int i, int j) { if(i < 0 || j < 0 || i > MAXSIZE || j > MAXSIZE){ return null; } int [][] result = new int[i][j]; int up = 0; int down = i-1; int left = 0; int right = j-1; int num = 1; while(up <= down && left <= right){ for(int m = left; m <= right; m++){ result[up][m] = num; num++; } if(up == down) break; up++; for(int m = up; m <= down; m++){ result[m][right] = num; num++; } if(left == right) break; right--; for (int m = right; m >= left; m--) { result[down][m] = num; num++; } down--; for (int m = down; m >= up; m--) { result[m][left] = num; num++; } left++; } return result; } }
下面是递归方法来实现:
/** * @类功能说明: 二维数组的顺时针填充 递归方法实现 * @类修改者: * @修改日期: * @修改说明: * @作者:Administrator * @创建时间:2013-3-22 下午10:18:42 * @版本:V1.0 */ public class SpiralNumber implements ISpiralNumber { public static final int MAXSIZE = 100; @Override public int[][] genArray(int i, int j) { if(i < 0 || j < 0 || i > MAXSIZE || j > MAXSIZE){ return null; } int [][] result = new int[i][j]; autoFill(new Point(0,0),1,result); return result; } private void autoFill(Point s ,int value , int [][] array ) { if(s!= null ) { array[s.x][s.y] = value ; value = value + 1; Point next = getNextPoint(s,array); autoFill(next,value,array); } } private Point getNextPoint(Point s,int [][] array) { int xMax = array.length; int yMax = array[0].length; boolean left = false ; boolean right = false; boolean up = false; boolean down = false ; if (s.y-1 >= 0 && array[s.x][s.y-1] == 0) { left = true; } if (s.y+1 < yMax && array[s.x][s.y+1] == 0 ) { right = true; } if (s.x-1 >= 0 && array[s.x-1][s.y] == 0 ) { up = true; } if (s.x+1 < xMax && array[s.x+1][s.y] == 0 ) { down = true; } if(left && right && up && down ) return null; else if(!left) { if(up) { return new Point(s.x-1,s.y); } if(right) { return new Point(s.x,s.y+1); } if(down) { return new Point(s.x+1,s.y); } } else if(!right) { if(down) { return new Point(s.x+1,s.y); } if(left) { return new Point(s.x,s.y-1); } if(up) { return new Point(s.x-1,s.y); } } else if(!up) { if(right) { return new Point(s.x,s.y+1); } if(down) { return new Point(s.x+1,s.y); } if(left) { return new Point(s.x,s.y-1); } } else if(!down) { if(left) { return new Point(s.x,s.y-1); } if(up) { return new Point(s.x-1,s.y); } if(right) { return new Point(s.x,s.y+1); } } return null; } class Point { Point(int x,int y ) { this.x = x; this.y = y; } int x ; int y ; } }