棋盘覆盖的详细算法如下(分治法)
来源:互联网 发布:java字符串处理题目 编辑:程序博客网 时间:2024/06/10 05:46
分析数组board[M][M]表示棋盘该数组的所有元素
的初值都为0。
①chessBoard(0,0,0 ,1 ,4)
t=1,(tile=2,tile的初值1赋给t,而后tile自增1变为2)
s=2;
经判断特殊方格在棋盘的左上角。
②chessBoard(0,0,0 ,1 ,2)
t=2,(tile=3)
s=1;
左上角无特殊方格 board[0][0]=2;
右上角有特殊方格 此时board[0][1]=0
左下角无特殊方格 board[1][0]=2;
右下角无特殊方格 board[1][1]=2;
①chessBoard(0,0,0 ,1 ,4)
t=1,(tile=2,tile的初值1赋给t,而后tile自增1变为2)
s=2;
右上角无特殊方格 board[1][2]=1;
③chessBoard(0,2,1,2,2)
t=3,(tile=4)
s=1;
左上角无特殊方格 board[0][2]=3;
右上角无特殊方格 board[0][3]=3;
左下角有特殊方格此时board[1][2]=1
右下角无特殊方格 board[1][3]=3;
①chessBoard(0,0,0 ,1 ,4)
t=1,(tile=2,tile的初值1赋给t,而后tile自增1变为2)
#include<iostream>#include<iomanip>#include<stdio.h>using namespace std;int Board[4][4];///二维整形数组4*4的棋盘int tile=1;///全局变量,表示L型骨牌号void InitChessBoard(int m,int n)///表示初始化{ for(int i=0;i<4;i++) for(int j=0;j<4;j++) { Board[i][j]=0; }}/** tr表示棋盘左上角的行号 tc表示棋盘左上角的列号 dr表示特殊方格左上角的列号 dc表示特殊方格左上角的列号 size=2&k*/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);///此时长度发生变化(递归分治,将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);///覆盖其他方格 }}void OutPut(int n,int m)///输出覆盖后的棋盘矩阵{ for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cout<<setw(5)<<Board[i][j]; } cout<<endl<<endl; }}int main(){ cout<<"\t输出ChessBoard(棋盘覆盖的算法如下——L型骨牌覆盖)"<<endl<<endl; int k;///表示边长的次方() int n;///表示特殊方格的行号 int m;///表示特殊方格的列号 cin>>k; cin>>n; cin>>m; InitChessBoard(4,4); ChessBoard(0,0,n,m,4); cout<<endl<<endl; OutPut(4,4); cout<<endl<<endl; return 0;}
阅读全文
0 1
- 棋盘覆盖的详细算法如下(分治法)
- 棋盘覆盖(分治算法)
- 分治算法--棋盘覆盖
- 分治算法---棋盘覆盖
- 棋盘覆盖(分治法)
- js算法:分治法-棋盘覆盖
- 分治法,棋盘覆盖
- 分治法:棋盘覆盖
- 棋盘覆盖--分治法
- 分治法-棋盘覆盖问题
- 分治法:棋盘覆盖问题
- 棋盘覆盖问题 (分治法)
- 分治法之棋盘覆盖
- 棋盘覆盖问题 - 分治法
- 棋盘覆盖问题 分治法
- 分治法---棋盘覆盖问题
- 棋盘覆盖【递归分治法】
- 分治法解决棋盘覆盖
- 【NOIP2017提高A组模拟10.5】Ping
- Python笔记1——以numpy包为主
- pata1100
- 【C++】浅谈C++中的继承
- 【Spring】高级装配
- 棋盘覆盖的详细算法如下(分治法)
- 深度学习进阶(一.1)--结合GPU搭建theano失败(驱动不匹配,哎)
- 模拟填表-阿杰
- vs2015 64位系统下使用mdb数据库问题
- MySQL知识点
- Ubuntu上搭建Hadoop时出现的一个问题
- linux 网络虚拟化:network namespace 简介
- Hibernate初学者---多对多双向关联数据表的CRUD增删改查
- BZOJ 1637: Balanced Lineup 巧妙变换