• 棋盘覆盖问题


     在一个2^k * 2^k个方格组成的棋盘中,有一个方格与其它的不同,若使用以下四种L型骨牌覆盖除这个特殊方格的其它方格,如何覆盖。


        四各L型骨牌如下图1



                        图1  

    棋盘中的特殊方格如图2



            图2

        实现的基本原理是将2^k * 2^k的棋盘分成四块2^(k - 1) * 2^(k - 1)的子棋盘,特殊方格一定在其中的一个子棋盘中,如果特殊方格在某一个子棋盘中,继续递归处理这个子棋盘,直到这个子棋盘中只有一个方格为止如果特殊方 格不在某一个子棋盘中,将这个子棋盘中的相应的位置设为骨牌号,将这个无特殊方格的了棋盘转换为有特殊方格的子棋盘,然后再递归处理这个子棋盘。以上原理 如图3所示。



           图3

    带bug版本的java实现:不知道为什么当size大于4的时候得出的是错误的结果

    tr:棋盘左上角方格的行号

    tc:棋盘左上角方格的列号

    dr:特殊方格所在的行号

    dc:特殊方格所在的列号

    size:棋盘规格,size*size

     1 public class Chessboard {
     2     
     3     public static int i=0;
     4     public static int size=10;
     5     public static int board[][] = new int[size][size];
     6     
     7     public static void chessBoard(int tr,int tc,int dr,int dc,int size){
     8         if(size==1) return;  //棋盘只有一个格的时候不再覆盖
     9         int s=size/2;         //分割棋盘 
    10         int t=++i;
    11         
    12         //覆盖左上角棋盘
    13         if(dr<tr+s&&dc<tc+s)
    14             //特殊方格在此棋盘中
    15             chessBoard(tr,tc,dr,dc,s);
    16         else{//此棋盘中无特殊方格
    17             //覆盖右下角
    18             board[tr+s-1][tc+s-1]=t;
    19             //覆盖其余方格
    20             chessBoard(tr,tc,tr+s-1,dc+s-1,s);
    21         }
    22         
    23         //覆盖右上角棋盘
    24         if(dr<tr+s&&dc>=tc+s)
    25             //特殊方格在此棋盘中
    26             chessBoard(tr,tc+s,dr,dc,s);
    27         else{//此棋盘中无特殊方格
    28             //覆盖左下角
    29             board[tr+s-1][tc+s]=t;
    30             //覆盖其余方格
    31             chessBoard(tr,tc+s,tr+s-1,tc+s,s);
    32         }
    33         
    34         //覆盖左下角棋盘
    35         if(dr>=tr+s&&dc<tc+s)
    36             //特殊方格在此棋盘中
    37             chessBoard(tr+s,tc,dr,dc,s);
    38         else{//此棋盘中无特殊方格
    39             //覆盖右上角
    40             board[tr+s][tc+s-1]=t;
    41             //覆盖其余方格
    42             chessBoard(tr+s,tc,tr+s,tc+s-1,s);
    43         }
    44         
    45         //覆盖右下角棋盘
    46         if(dr>=tr+s&&dc>=tc+s)
    47             //特殊方格在此棋盘中
    48             chessBoard(tr+s,tc+s,dr,dc,s);
    49         else{//此棋盘中无特殊方格
    50             //覆盖左上角
    51             board[tr+s][tc+s]=t;
    52             //覆盖其余方格
    53             chessBoard(tr,tc,tr+s,tc+s,s);
    54         }
    55         
    56     }
    57     
    58     public static void main(String[] args) {
    59         chessBoard(0, 0, 2, 2, 4);
    60         for(int i=0;i<4;i++)
    61             for(int j=0;j<4;j++)
    62             {
    63                 if(j==0)
    64                     System.out.println();
    65                 System.out.print(" "+board[i][j]);
    66             }
    67     }
    68 
    69 }

    没法保证chessBoard函数中无特殊方格的子棋盘被正确覆盖。

  • 相关阅读:
    libeXosip2(1-2) -- How-To initiate, modify or terminate calls.
    libeXosip2(1-1) -- How-To initialize libeXosip2.
    libeXosip2(1) -- Modules
    麦田的守望者背景与分析
    statfs函数说明
    c++ 14
    c++ 13
    URAL 2078~2089
    2018 Multi-University Training Contest 1
    Codeforces Round #502
  • 原文地址:https://www.cnblogs.com/eleven24/p/4240015.html
Copyright © 2020-2023  润新知