棋盘覆盖问题 —— 分治法

/*分治法实现棋盘覆盖问题*/
#include
//tr:棋盘左上角方格的行号  tc:棋盘左上角方格的列号
//dr:特殊方格的行号        dc:特殊方法的列号
//size:size=2的k次方,棋盘规格为2的k次方
//tile:L型骨牌的编号,初始值为1
int Board[100][100];
int tile=1;
void ChessBoard(int tr,int tc,int dr,int dc,int size){
	if(size==1)  return;
	int t=tile++,s=size/2;				   //L型骨牌号,分割棋盘
	//覆盖左上角子棋盘
	if(dr=tc+s){			       //特殊方格在此棋盘内
		ChessBoard(tr,tc+s,dr,dc,s);
	}else{								   //特殊方格不在此棋盘内
		Board[tr+s-1][tc+s]=t;			   //用t号L型骨牌覆盖左下角
		ChessBoard(tr,tc+s,tr+s-1,tc+s,s); //覆盖其余方格
	}
	//覆盖左下角子棋盘
	if(dr>=tr+s&&dc=tr+s&&dc>=tc+s){				   //特殊方格在此棋盘内
		ChessBoard(tr+s,tc+s,dr,dc,s);
	}else{								   //特殊方格不在此棋盘内
		Board[tr+s][tc+s]=t;			   //用t号L型骨牌覆盖左上角
		ChessBoard(tr+s,tc+s,tr+s,tc+s,s); //覆盖其余方格 
	}
}

int main(){
	int tr,tc,dr,dc,CHESSBOARD_SIZE;
	printf("请输入棋盘规格:");
	scanf("%d",&CHESSBOARD_SIZE);
	printf("请输入特殊方格所在行和列:");
	scanf("%d,%d",&dr,&dc);
	ChessBoard(0,0,dr,dc,CHESSBOARD_SIZE);
    for (tr=0;tr

 

转载于:https://my.oschina.net/u/3761238/blog/2713551

你可能感兴趣的:(棋盘覆盖问题 —— 分治法)