算法分析与设计之棋盘覆盖问题

  • 问题描述:在一个2K*2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中我们要用4个不同形态的L行形骨牌覆盖一个特定的棋盘上除特殊方格以外的所有方格,并且任何2个L形骨牌不得重叠覆盖。
  • 问题分析:对于特殊方格在棋盘上的位置,显然有4K种不同情形,也就意味着有4k种不同的棋盘,在任何一个2k*2K的棋盘覆盖中,用到的L形骨牌个数恰为(4k-1)/3
  • 算法思想:在解决棋盘覆盖问题时,我们可以将棋盘分割为4个子棋盘,而那个特殊方块必位于这4个子棋盘中,其余的3个子棋盘没有特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用L型骨牌覆盖这3个子棋盘的汇合处。从而形成4个都有特殊方格的子棋盘,进而将该问题转化为4个子棋盘的覆盖问题,而这4个子棋盘又可以进一步递归下去,直到棋盘简化为1*1的棋盘
  • 1 2
    3 4
  • 程序代码:
  • #include
    using namespace std;
    int Board[4][4];
    int tile=0;
    void ChessBoard(int tr,int tc,int dr,int dc,int size)
    {
    	
    	if(size==1)
    		return ;
    	int t=tile++;
    	int s=size/2;
    	//cout<=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=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()
    {
    	ChessBoard(0,0,0,0,4);
    	for(int i=0;i<4;i++)
    	{
    		for(int j=0;j<4;j++)
    		{
    			cout<<"   "<

    运行截图:
  • 算法分析与设计之棋盘覆盖问题_第1张图片

你可能感兴趣的:(算法分析)