棋盘覆盖-分治法(代码实现)
程序员文章站
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;
}
上一篇: 洛谷 P1014 Cantor表 题解
下一篇: 三角板棋盘覆盖问题及棋盘覆盖着色效果