一个简单的算法笔试题目 : 二维数组的顺时针填充的两种实现方法

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

  


  

原文地址:https://www.cnblogs.com/treemanfm/p/2976440.html