棋盘覆盖问题-递归分治
2016-11-25 20:48
411 查看
输入:3 3 4
输出:如图
x=3 ,y=3代表特殊方块的坐标(坐标原点在坐标系左上角)
如图也就是一个 size=4 的L型骨牌的棋盘覆盖问题。
#include <iostream> #include <cstdio> using namespace std; int Board[20][20]; int tile=1; 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); } } int main() { int dr,dc,size,i,j; cin>>dr>>dc>>size; //3 3 4 Board[dr][dc]=0; ChessBoard(1,1,dr,dc,size); for(i=1;i<20;i++){ for(j=1;j<20;j++) printf("%3d",Board[i][j]); cout<<Board[i][j]; cout<<endl; } return 0; }
相关文章推荐
- 棋盘覆盖问题(递归与分治)
- 棋盘覆盖问题(递归与分治,紫书P229)
- 递归分治策略——Java之棋盘覆盖问题解决
- 递归分治解决棋盘覆盖问题
- 棋盘覆盖(递归分治问题)
- 棋盘覆盖问题(递归分治)
- 分治与递归:棋盘覆盖问题
- [分治,递归]棋盘覆盖问题
- [递归与分治]棋盘覆盖问题
- 递归与分治策略之棋盘覆盖问题
- 高效算法设计_递归与分治(棋盘覆盖问题,循环日程表,巨人与鬼)
- 分治与递归-棋盘覆盖问题
- 实验一 分治与递归―棋盘覆盖问题 java实现
- 递归与分治之棋盘覆盖问题
- 递归与分治之棋盘覆盖问题
- 棋盘覆盖问题 - 分治法
- 棋盘覆盖问题【分治】
- 【题】【分治】NKOJ2307 棋盘覆盖问题
- 棋盘覆盖问题 (分治)
- 递归之棋盘覆盖问题