棋盘覆盖问题 分治法
2017-04-04 19:49
423 查看
#include<iostream> #include<math.h> using namespace std; int Board[105][105]; static int tile=1; void ChessBoard(int tr,int tc,int dr,int dc,int size) { if(size==1) return; int t=tile++;//L型骨牌号 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; 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,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 k; while(cin>>k)//2^k*2^k的方格 { int size=pow(2,k)*pow(2,k); int x,y; cin>>x>>y;//特殊方格的坐标 Board[x][y]=0; ChessBoard(0,0,x,y,size); for(int i=0;i<size;i++) { for(int j=0;j<size;j++) { cout<<Board[i][j]<<"\t"; } cout<<endl; } } return 0; }
相关文章推荐
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 【分治法】分治法与二分搜索,棋盘覆盖问题
- 计算机算法设计与分析作业01:分治法求解大数乘法+L型骨牌的棋盘覆盖问题
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 分治法——棋盘覆盖问题
- 03算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 分治法:棋盘覆盖问题
- 棋盘覆盖问题(分治法)
- 经典算法之棋盘覆盖问题 --分治法
- 分治法---棋盘覆盖问题
- 0003算法笔记——【分治法】分治法与二分搜索,棋盘覆盖问题
- 分治法——棋盘覆盖问题
- 棋盘覆盖问题 (分治法)
- 算法java实现--分治法--棋盘覆盖问题
- 棋盘覆盖问题 - 分治法(c++)
- 用Java解决棋盘覆盖问题
- 棋盘覆盖问题
- 棋盘的完美覆盖问题,c++代码实现
- 高精度计算模板——棋盘覆盖问题
- 高精度计算模板——棋盘覆盖问题