题目描述:
在一个n×n (n = 2的k次方)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
输入:
多组测试用例,每组测试用例包括两部分,
第一部分为方格的宽度n,
第二部分则为方格,特殊方格为-1,其他方格为0。
输出:
输出覆盖后的方案
解题思路:
由题可知,这主要棋盘的格数是4的k次方。我们主要是在把这个棋盘分成四部分,判断其是否有特殊方格,如果有,就不添加特殊方格,没有,就添加特殊方格(左上角这个区域填右下角这个方格,右上角填左下角这个方格,左下角这个区域填右上角这个方格,右小角填左上角这个方格),直到全部填完。
代码:
import java.util.Scanner;
public class DemoFour {
static int boardCodeGlobal = 1;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int arrrayDimension = sc.nextInt();
int[][] arr = new int[arrrayDimension][arrrayDimension];
int dY = 0, dX = 0;
for (int i = 0; i < arrrayDimension; i++) {
for (int j = 0; j < arrrayDimension; j++) {
arr[i][j] = sc.nextInt();
if (arr[i][j] == -1) {
dY = i;
dX = j;
}
}
}
chessBoard(arr, 0, 0, dX, dY, arrrayDimension);
printArray(arr);
boardCodeGlobal = 1;
}
sc.close();
}
// 填方格
public static void chessBoard(int[][] arr, int tX, int tY, int dX, int dY, int size) {
if (size == 1)
return;
int boardCode = boardCodeGlobal++;
int size2 = size / 2;
// 在左上角
if (dX < tX + size2 && dY < tY + size2) {
chessBoard(arr, tX, tY, dX, dY, size2);
} else {
int targetX = tX + size2 - 1;
int targetY = tY + size2 - 1;
arr[targetY][targetX] = boardCode;
chessBoard(arr, tX, tY, targetX, targetY, size2);
}
// 在左下角
if (dX < tX + size2 && dY >= tY + size2) {
chessBoard(arr, tX, tY + size2, dX, dY, size2);
} else {
int targetX = tX + size2 - 1;
int targetY = tY + size2;
arr[targetY][targetX] = boardCode;
chessBoard(arr, tX, tY + size2, targetX, targetY, size2);
}
// 在右上角
if (dX >= tX + size2 && dY < tY + size2) {
chessBoard(arr, tX + size2, tY, dX, dY, size2);
} else {
int targetX = tX + size2;
int targetY = tY + size2 - 1;
arr[targetY][targetX] = boardCode;
chessBoard(arr, tX + size2, tY, targetX, targetY, size2);
}
// 在右下角
if (dX >= tX + size2 && dY >= tY + size2) {
chessBoard(arr, tX + size2, tY + size2, dX, dY, size2);
} else {
int targetX = tX + size2;
int targetY = tY + size2;
arr[targetY][targetX] = boardCode;
chessBoard(arr, tX + size2, tY + size2, targetX, targetY, size2);
}
}
public static void printArray(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]);
if (j < arr[i].length - 1) {
System.out.print(" ");
}
}
System.out.println();
}
}
}