您的位置:首页 > 其它

棋盘覆盖问题-递归分治

2016-11-25 20:48 411 查看


输入:3  3   4

输出:如图

x=3 ,y=3代表特殊方块的坐标(坐标原点在坐标系左上角)

如图也就是一个 size=4 的L型骨牌的棋盘覆盖问题。

#include <iostream>
#include <cstdio>

using namespace std;

int Board[20][20];
int tile=1;
void ChessBoard(int tr,int tc,int dr,int dc,int size){

if(size==1)
return;

int t =tile++;
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;
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 dr,dc,size,i,j;

cin>>dr>>dc>>size; //3 3 4
Board[dr][dc]=0;
ChessBoard(1,1,dr,dc,size);
for(i=1;i<20;i++){
for(j=1;j<20;j++)
printf("%3d",Board[i][j]);
cout<<Board[i][j];
cout<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: