棋盘覆盖-分治法(代码实现)

这是棋盘覆盖的代码实现,至于原理,请参考我的上一篇博客:棋盘覆盖问题-分治法

实现的效果如下:

棋盘覆盖-分治法(代码实现)_第1张图片

或者如下:

棋盘覆盖-分治法(代码实现)_第2张图片

其中0表示递归过程中标记的所有奇异点

实现代码如下:


	  //棋盘大小size, 奇异点的坐标(x,y),以及棋子初始的标记值,可随意
	public static int[][] chessBoard(int size, int jx, int jy, int tag )
	{
		
		if(size == 2)
		{
			
			int [][]re = new int[2][2];
			for(int x = 0 ; x<2; x++)
				for(int y = 0 ; y<2; y++)
					if(!(x == jx && y == jy))
						re[x][y] = tag;
			return re;
		}
		else
		{
			;
			if(jx < size/2  && jy < size/2)//奇异点在左上角
				return MatrixBlockPlus(chessBoard(size/2,jx,jy,++tag),chessBoard(size/2,size/2 - 1, 0,++tag),chessBoard(size/2,0,size/2 -1,++tag), chessBoard(size/2,0,0,++tag));
			else if(jx < size/2 && jy >= size/2)//奇异点在右上角
				return MatrixBlockPlus(chessBoard(size/2,size/2 -1,size/2 -1,++tag),chessBoard(size/2,jx, jy - size/2,++tag),chessBoard(size/2,0,size/2 -1,++tag), chessBoard(size/2,0,0,++tag));
			else if(jx >=size/2 && jy < size/2)//奇异点在左下角
				return MatrixBlockPlus(chessBoard(size/2,size/2 -1,size/2 -1,++tag),chessBoard(size/2,size/2 -1, 0,++tag),chessBoard(size/2,jx - size/2 ,jy,++tag), chessBoard(size/2,0,0,++tag));
			else 
				return MatrixBlockPlus(chessBoard(size/2,size/2 -1,size/2 -1,++tag),chessBoard(size/2,size/2 -1, 0,++tag),chessBoard(size/2,0,size/2 -1,++tag), chessBoard(size/2,jx - size/2, jy - size/2,++tag));

		}
	}
	
	
	 public static int[][] MatrixBlockPlus(int [][]A11, int [][]A12, int [][]A21, int [][]A22)
	  {
		 //将A11,A12,A21,A22按照左上,右上,左下,右下的顺序组合成一矩阵。
		  if(A11[0].length+A12[0].length != A21[0].length+A22[0].length || A11.length+A21.length != A12.length+A22.length) return null;
		  
		  int result[][] = new int[A11.length+A21.length][A11[0].length+A12[0].length];
		  for(int i = 0; i

你可能感兴趣的:(经典算法,Java)