分治算法之棋盘覆盖

代码

#include
using namespace std;

int ncount=0;//计算L型骨牌的数量
int matrix[100][100]={0}; 

void chessBoard(int tr,int tc,int dr,int dc,int size)
//tr 左上角方格的行号   tc  左上角方格的列号 
//dr 特殊方格的行号  dc  特殊方格的列号    size  棋盘的大小   
{
	int s,t;
	if(size ==1)
	   return ;
    s=size/2;//棋盘进行分割    
	t=++ncount;//t表示方格编号
	
	if(dr<tr+s && dc<tc+s){
		chessBoard(tr,tc,dr,dc,s);//左上角 
	} 
	else{
		matrix[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{
        matrix[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{
        matrix[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{
        matrix[tr+s][tc+s] = t;
        chessBoard(tr+s,tc+s,tr+s,tc+s,s);
    }    
    
}
int main()
{
	int size,row,col;
	cout<<"请输入棋盘大小,特殊方格的行号、列号\n";
	cin>>size>>row>>col;
	chessBoard(0,0,row,col,size);
	
	for(int r=0;r<size;r++){
		for(int c=0;c<size;c++){
			cout<<matrix[r][c]<<" ";
		}
		cout<<endl;
	}
	return 0;
} 

辅助图

分治算法之棋盘覆盖_第1张图片

参考资料

B站视频 视频

你可能感兴趣的:(算法)