棋盤覆蓋問題(分治思想)


  在一個2^k * 2^k個方格組成的棋盤中,有一個方格與其它的不同,若使用以下四種L型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。四個L型骨牌如下圖:

       棋盤中的特殊方格如圖:

 

       實現的基本原理是將2^k * 2^k的棋盤分成四塊2^(k - 1) * 2^(k - 1)的子棋盤,特殊方格一定在其中的一個子棋盤中,如果特殊方格在某一個子棋盤中,繼續遞歸處理這個子棋盤,直到這個子棋盤中只有一個方格為止如果特殊方格不在某一個子棋盤中,將這個子棋盤中的相應的位置設為骨牌號,將這個無特殊方格的了棋盤轉換為有特殊方格的子棋盤,然后再遞歸處理這個子棋盤。以上原理如圖所示:

      棋盤覆蓋程序如下:

#include <iostream>       
using namespace std;   
  
int tile = 1;//全局變量 骨牌編號  
int Board[4][4];//棋盤  
void ChessBoard(int tr,int tc,int dr,int dc,int size);  
  
int main()  
{  
    for(int i=0; i<4; i++)  
    {  
        for(int j=0; j<4; j++)  
        {  
            Board[i][j] = 0;  
        }  
    }  
  
    ChessBoard(0,0,2,3,4);  
  
    for(int i=0; i<4; i++)  
    {  
        for(int j=0; j<4; j++)  
        {  
            cout<<Board[i][j]<<" ";  
        }  
        cout<<endl;  
    }  
}  
  
/** 
 * tr : 棋盤左上角的行號,tc棋盤左上角的列號 
 * dr : 特殊方格左上角的行號,dc特殊方格左上角的列號 
 * size :size = 2^k 棋盤規格為2^k*2^k 
 */  
void ChessBoard(int tr,int tc,int dr,int dc,int size)  
{  
    if(size == 1)  
    {  
        return;  
    }  
    int t = tile++;//L型骨牌編號  
    int s = size/2;//分割棋盤  
  
    //覆蓋左上角子棋盤  
    if(dr<tr+s && dc<tc+s)//特殊方格在此棋盤中  
    {  
        ChessBoard(tr,tc,dr,dc,s);  
    }  
    else//特殊方格不在此棋盤中  
    {  
        //用編號為t的骨牌覆蓋右下角  
        Board[tr+s-1][tc+s-1] = t;  
        //覆蓋其余方格  
        ChessBoard(tr,tc,tr+s-1,tc+s-1,s);  
    }  
  
    //覆蓋右上角子棋盤  
    if(dr<tr+s && dc>=tc+s)//特殊方格在此棋盤中  
    {  
        ChessBoard(tr,tc+s,dr,dc,s);  
    }  
    else//特殊方格不在此棋盤中  
    {  
        //用編號為t的骨牌覆蓋左下角  
        Board[tr+s-1][tc+s] = t;  
        //覆蓋其余方格  
        ChessBoard(tr,tc+s,tr+s-1,tc+s,s);  
    }  
  
    //覆蓋左下角子棋盤  
    if(dr>=tr+s && dc<tc+s)//特殊方格在此棋盤中  
    {  
        ChessBoard(tr+s,tc,dr,dc,s);  
    }  
    else//特殊方格不在此棋盤中  
    {  
        //用編號為t的骨牌覆蓋右上角  
        Board[tr+s][tc+s-1] = t;  
        //覆蓋其余方格  
        ChessBoard(tr+s,tc,tr+s,tc+s-1,s);  
    }  
  
    //覆蓋右下角子棋盤  
    if(dr>=tr+s && dc>=tc+s)//特殊方格在此棋盤中  
    {  
        ChessBoard(tr+s,tc+s,dr,dc,s);  
    }  
    else//特殊方格不在此棋盤中  
    {  
        //用編號為t的骨牌覆蓋左上角  
        Board[tr+s][tc+s] = t;  
        //覆蓋其余方格  
        ChessBoard(tr+s,tc+s,tr+s,tc+s,s);  
    }  
  
}  

 

 

 

 

      程序運行結果如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM