欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-13 17:18:32
...

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

实现的效果如下:

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

或者如下:

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

其中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<A11.length+A21.length; i++)
			  for(int j = 0; j<A11[0].length+A12[0].length; j++)
			  {
				  if(i<A11.length)
				  {
					  if(j<A11[0].length)
					  {
						  result[i][j] = A11[i][j];
					  }
					  else
					  {
						  result[i][j] = A12[i][j-A11[0].length];
					  }
				  }
				  else
				  {
					  if(j<A12[0].length)
					  {
						  result[i][j] = A21[i-A11.length][j];
					  }
					  else
					  {
						  result[i][j] = A22[i-A11.length][j-A12[0].length];
					  }
				  } 
			  }
		  return result;
		  
	  }