Java实现棋盘覆盖

题目描述:

在一个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();
        }
    }

}

猜你喜欢

转载自blog.csdn.net/weixin_43394832/article/details/105317335
今日推荐