您的位置:首页 > 其它

使用分治法解决棋盘覆盖问题

2006-09-16 23:09 435 查看
棋盘覆盖问题的解法,使用C语言写成,放在这里是为了以后忘记了可以拿过来看看。




/**//*


* ============================================================================


*


* Filename: chess_board.c


*


* Description: the solution of chess board's coverage


*


* Version: 1.0


* Created: 09/16/06 22:37:43 CST


* Revision: none


* Compiler: gcc


*


* Author: lirui (colin), lirui@ncic.ac.cn


* Company: asl.ncic.ac.cn


*


* ============================================================================


*/




#include <stdio.h>




#define MAXSIZE 1<<10




int chess[MAXSIZE][MAXSIZE];


void chess_board(int tr, int tc, int dr, int dc, int size)




...{


static int tile = 1;




if(1==size) return;




int t = tile++;


int s = (size>>1);






/**//* ---- left-up corner ---- */




if(dr<tr+s && dc<tc+s)...{


chess_board(tr, tc, dr, dc, s);




} else ...{


chess[tr+s-1][tc+s-1] = t;


chess_board(tr, tc, tr+s-1, tc+s-1, s);


}






/**//* ---- right-up corner --- */




if(dr<tr+s && dc>=tc+s)...{


chess_board(tr, tc+s, dr, dc, s);




} else ...{


chess[tr+s-1][tc+s] = t;


chess_board(tr, tc+s, tr+s-1, tc+s, s);


}






/**//* ---- left-down corner--- */




if(dr>=tr+s && dc<tc+s)...{


chess_board(tr+s, tc, dr, dc, s);




} else ...{


chess[tr+s][tc+s-1] = t;


chess_board(tr+s, tc, tr+s, tc+s-1, s);


}






/**//* ---- right-down corner-- */




if(dr>=tr+s && dc>=tc+s)...{


chess_board(tr+s, tc+s, dr, dc, s);




} else ...{


chess[tr+s][tc+s] = t;


chess_board(tr+s, tc+s, tr+s, tc+s, s);


}


}




void print_chess(int size)




...{


int i, j;




for(i = 0; i<size; i++)...{


for(j=0; j<size; j++)


printf("%4d", chess[i][j]);


printf(" ");


}


}




int main( int argc, char *argv[] )




...{


chess_board(0, 0, 1, 2, 16);


print_chess(16);


return 0;




} /**//* ---------- end of function main ---------- */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: