分治算法-棋盘覆盖问题
在一个2k×2k个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。
#include<stdio.h> #define MAX 1025 //问题表示 int k; //棋盘大小 int x,y; //特殊方格的位置 //求解问题表示 int board[MAX][MAX]; int tile=1; void ChessBoard(int tr,int tc,int dr,int dc,int size) { if(size==1) return; //递归出口 int t = tile++; //取一个L型骨,其牌号为tile int s = size/2; //分割棋盘 //考虑左上角象限 if(dr<tr+s && dc<tc+s) { //特殊方格在此象限中 ChessBoard(tr,tc,dr,dc,s); } else { //此象限中无特殊方格 board[tr+s-1][tc+s-1]=t; //用t号L型骨牌覆盖右下角 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; //用t号L型骨牌覆盖左下角 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; //用t号L型骨牌覆盖右上角 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; //用t号L型骨牌覆盖左上角 ChessBoard(tr+s,tc+s,tr+s,tc+s,s); //将左上角作为特殊方格继续处理该象限 } }