您的位置:首页 > 其它

棋盘覆盖(分治-递归)

2010-10-12 17:17 274 查看
#include<iostream>

using namespace std;

int tile=0;//tile表示L型骨牌的编号

int Board[100][100]={0};//用一个二维整型数组Board表示棋盘,Board[0][0]是棋盘的左上角方格

void ChessBoard(int tr,int tc,int dr,int dc,int size)

{//tr表示棋盘左上角方格的行号

//tc表示棋盘左上角方格的列号

//dr表示特殊方格所在的行号

//dc表示特殊方格所在的列号

//size=2的k次方,棋盘的规格为2的k次方*2的k次方



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

{

//此棋盘中无特殊方格

//用t号L型牌覆盖右下角

Board[tr+s-1][tc+s-1]=t;//下标从零开始,所以减1

//覆盖其余方格

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

{

//此棋盘中无特殊方格

//用t号L型骨牌覆盖左下角

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

{

//用t号L型牌覆盖右上角

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

{

//用t号L型骨牌覆盖左上角

Board[tr+s][tc+s]=t;

//覆盖其余方格

ChessBoard(tr+s,tc+s,tr+s,tc+s,s);

}



}

int main(int argc, char* argv[])

{

int size;//棋盘的维数

int tr,tc;//棋盘左上角方格的行号与列号

int dr,dc;//特殊方格所在行号与列号

cout<<" 请输入棋盘的维数(注意维数必须为2的k次方 )"<<endl;

cin>>size;

cout<<"请输入棋盘左上角的方格的行号与列号"<<endl;

cin>>tr>>tc;

cout<<"请输入特殊方格所在的行号与列号"<<endl;

cin>>dr>>dc;

ChessBoard(tr,tc,dr,dc,size);

//输出棋盘

for(int i=0;i<size;i++)

{

for(int j=0;j<size;j++)

printf("%4d",Board[i][j]);

cout<<endl;

}

return 0;

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