棋盘覆盖

/*棋盘覆盖 2^k * 2^k个方格组成的棋盘,其中有一个特殊方格,然后用4种不同形态的L型骨牌覆盖给定的特殊
  棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖.
  用分治策略:
  当k>0时,将2^k * 2^k棋盘分割为4个2^k-1 * 2^k-1子棋盘;
  特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格.为了将这3个无特殊方格的子棋盘转化为
  特殊棋盘,可以用一个L型骨牌覆盖这3个较小子棋盘的会合处,这3个子棋盘上被L型骨牌覆盖的方格就成为该棋
  盘的特殊方格,从而将问题转化为4个较小规模的棋盘覆盖问题.递归地使用这种分割,直至棋盘简化为1*1棋盘.
*/

#include<iostream>
#include<cstdio>
using namespace std;

int tile=0;                 /*L型骨牌的编号*/
int board[256][256];         /*棋盘*/

/* tr:棋盘左上角方格的行号;
   tc:棋盘左上角方格的列号;
   dr:特殊方格所在的行号;
   dc:特殊方格所在的列号;
   size:棋盘规格.

*/
void chessBoard(int tr,int tc,int dr,int dc,int size)
{
    if(size==1) return;
    int t=tile++,s=size/2;
    /*覆盖左上角子棋盘*/
    if(dr<tr+s && dc<tc+s)
        chessBoard(tr,tc,dr,dc,s); /*特殊方格在此子棋盘中*/
    else
    {
        board[tr+s-1][tc+s-1]=t;            /*此子棋中无特殊方格,用t号L型骨牌覆盖右下角*/
        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
    {
        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
    {
        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
    {
        board[tr+s][tc+s]=t;
        chessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }
}

int main()
{
    int i,j,n,x,y;
    cout<<"Please enter the number of len:";
    cin>>n;
    do {
        cout<<"Please enter location of the special board:";
        cin>>x>>y;
    }while(x<0 || y<0 || x>n-1 || y>n-1);
    
    chessBoard(0,0,x-1,y-1,n);
    
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
            printf("%5d",board[i][j]);
        cout<<endl;
    }
    
    return 0;
} 


你可能感兴趣的:(ini)