棋盘覆盖(分治-递归)

来源:互联网 发布:有趣的网站 知乎 编辑:程序博客网 时间:2024/05/16 11:23

#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;
}
 

原创粉丝点击