您的位置:首页 > 其它

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

2017-12-02 11:20 260 查看
问题描述:在一个2K*2k个方格组成的棋盘中,若恰有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中我们要用4个不同形态的L行形骨牌覆盖一个特定的棋盘上除特殊方格以外的所有方格,并且任何2个L形骨牌不得重叠覆盖。
问题分析:对于特殊方格在棋盘上的位置,显然有4K种不同情形,也就意味着有4k种不同的棋盘,在任何一个2k*2K的棋盘覆盖中,用到的L形骨牌个数恰为(4k-1)/3
算法
bbe1
思想:
在解决棋盘覆盖问题时,我们可以将棋盘分割为4个子棋盘,而那个特殊方块必位于这4个子棋盘中,其余的3个子棋盘没有特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,我们可以用L型骨牌覆盖这3个子棋盘的汇合处。从而形成4个都有特殊方格的子棋盘,进而将该问题转化为4个子棋盘的覆盖问题,而这4个子棋盘又可以进一步递归下去,直到棋盘简化为1*1的棋盘

12
34

程序代码:
#include<iostream>
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<<t;
if(dr<tr+s&&dc<tc+s)
ChessBoard(tr,tc,dr,dc,s);
else
{
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
{
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()
{
ChessBoard(0,0,0,0,4);
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
cout<<"   "<<Board[i][j];

}
cout<<endl;
}
}


运行截图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息