用Java解决棋盘覆盖问题

Problem description

在一个2k x 2k ( 即:2^k x 2^k )个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

Input

输入文件第一行是一个整数T,表示有多少组测试数据,接下来是T组测试数据,共2T行,每组第一行为整数n,是2的n次幂(1<=n<=64),表示棋盘的大小为n*n,第二行是两个整数,代表特殊方格所在行号和列号。

解决思路:这道题可以用递归与分治的思想来解决,也就是把一个大的棋盘分成4个小棋盘,检索填充,然后在把小棋盘继续细分,直到棋盘中只包含一个格子为止,代码和分析过程如下:

import java.util.Scanner;/* * n:表示输入矩阵是n*n的方阵 * dr:表示特殊棋盘的行位置 * dc:表示特殊棋盘的列位置 * tr:表示当前所在棋盘的左上角的行位置 * tc:表示当前所在棋盘的左上角的列位置 *  */public class ChessBord {static int[][] matrix;static int count;public static void main(String[] args) {// TODO Auto-generated method stubScanner in = new Scanner(System.in);while(in.hasNextInt()) {int T = in.nextInt();for(int i = 0; i < T; i++) {int n = in.nextInt();int dr = in.nextInt();int dc = in.nextInt();matrix = new int[n][n];count = 0;chessBoard(0, 0, dr, dc, n);for(int[] ii : matrix) {for(int jj : ii) {System.out.printf("%8d", jj);}System.out.println();}}}}public static void chessBoard(int tr, int tc, int dr, int dc, int size) {//如果当前棋盘的尺寸是1,也就是说只有一个方格的时候,返回函数if(size ==1) return;int curPattern = ++count;//把棋盘从中间平均分为4个部分,size = size / 2;//下面方法分别检索分隔出来的4个部分//左上部分if(dr < tr + size && dc < tc + size) {//如果左上部分包含特殊棋盘,那么就直接递归找左上部分,继续把左上部分分隔chessBoard(tr, tc, dr, dr, size);} else {//如果左上部分不包含特殊棋盘,那么先把左上部分的右下角自定义一个特殊棋盘,然后在递归matrix[tr+size-1][tc+size-1] = curPattern;chessBoard(tr, tc, tr+size-1, tc+size-1, size);}//--下面方法都是类似写出if(dr < tr + size && dc >= tc + size) {chessBoard(tr, tc + size, dr, dc, size);} else {matrix[tr+size-1][tc+size] = curPattern;chessBoard(tr, tc + size, tr+size-1, tc+size, size);}if(dr >= tr + size && dc < tc + size) {chessBoard(tr + size, tc, dr, dc, size);} else {matrix[tr+size][tc+size-1] = curPattern;chessBoard(tr + size, tc, tr+size, tc+size-1, size);}if(dr >= tr + size && dc >= tc + size) {chessBoard(tr + size, tc + size, dr, dc, size);} else {matrix[tr+size][tc+size] = curPattern;chessBoard(tr + size, tc + size, tr+size, tc+size, size);}}}

学习不是人生的全部,但学习都征服不了,那我还能做什么?

用Java解决棋盘覆盖问题

相关文章:

你感兴趣的文章:

标签云: