您的位置:首页 > 其它

棋盘覆盖问题 分治法

2017-04-04 19:49 423 查看
#include<iostream>
#include<math.h>
using namespace std;

int Board[105][105];
static int tile=1;

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
{//此棋盘无特殊方格
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,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 k;
while(cin>>k)//2^k*2^k的方格
{
int size=pow(2,k)*pow(2,k);
int x,y;
cin>>x>>y;//特殊方格的坐标
Board[x][y]=0;

ChessBoard(0,0,x,y,size);

for(int i=0;i<size;i++)
{
for(int j=0;j<size;j++)
{
cout<<Board[i][j]<<"\t";
}
cout<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息