/** 棋盘覆盖问题 伪代码: chessBoard(int tr,int tc,int dr, int dc,int size) { if(size == 1) return; int s = size/2; int t = tile++; if (dr,dc) in top left then chessBoard(tr,tc,dr,dc,s) else board[tr+s-1][tc+s-1] = t chessBoard(tr,tc,tr+s-1,tc+s-1,s); if (dr,dc) in top right then 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,dc) in bottom left then chessBoard(tr+s,tc,dr,dc,s) else board[tr+s][tr+s-1] = t chessBoard(tr+s,tc,tr+s,tr+s-1,s) if (dr,dc) in bottom right then 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) } */ #include<cstdio> #include<cstring> int board[9][9]; int tile = 2; void init_board(); void display_board(); void chessBoard(int tr,int tc,int dr,int dc,int size); int main() { printf("Before cover the chessBoard: \n"); init_board(); display_board(); chessBoard(1,1,3,7,8); printf("\nAfter cover the chessBoard: \n"); display_board(); return 0; } void init_board() { memset(board,0,sizeof(board)); board[3][7] = 1; } void display_board() { for(int i=1;i<=8;i++){ for(int j=1;j<=8;j++){ printf("%3d ",board[i][j]); } printf("\n\n"); } } void chessBoard(int tr,int tc,int dr,int dc,int size) { if(size==1) return; int t = 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; //填充覆盖子棋盘 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); } }