棋盘覆盖

来源:互联网 发布:linux kill命令详解 编辑:程序博客网 时间:2024/04/28 22:45

/*Subject:计算机算法设计与分析Title:2.6 棋盘覆盖Coder:HaoClass:计科0906Num:0304090614Date:Sept 19th,2011 */#include <iostream>#include <stdio>#define N 10                              //棋盘最大长宽using namespace std;class ChessBoard{public://棋盘创建函数ChessBoard(int tr,int tc,int dr,int dc,int size)//tr:棋盘左上角方格的行号//tc:棋盘左上角方格的列号//dr:特殊方格所在的行号//dc:特殊方格所在的列号//size:方形棋盘的边长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 // 此棋盘无特殊方格 {//用t号L型骨型牌覆盖右下角 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); }}void Dispaly(int size)                //棋盘打印(输出)函数{for(int i=0;i<size;i++){for(int j=0;j<size;j++)printf("%2d",Board[i][j]);cout<<endl;}}private:static int  tile;static int Board[N][N];};int ChessBoard::tile=1;int ChessBoard::Board[N][N]={0};void main(){int n;                            //实际棋盘大小    cout<<"请输入棋盘行(列)大小n(n须为2的k次方):";cin>>n;ChessBoard c(0,0,0,0,n);            //假设特殊棋子在(2,2)点c.Dispaly(n);}


	
				
		
原创粉丝点击