定义接口:
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 ;
}
}