分治算法——棋盘覆盖

简介: 分治算法——棋盘覆盖
//算法思想:当k=0时,及特殊方格,骨牌数为1.
//当k>0时,将2的k次方*2的k次方棋盘划分为4个较小的棋盘,而其余三个子棋盘中无特殊方格。
//继续递归成4个较小的棋盘。
//用L型骨牌覆盖在3个子棋盘汇合处。
int tile = 1;
int Board[8][8];
void ChessBoard(int tr, int tc, int dr, int dc, int size) {
  //tr棋盘左上角方格的行号
  //tc棋盘左上角方格的列号
  //dr特殊方格的行号
  //dc特殊方格的列号
  //size 棋盘规模2的k次方
  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);//递归的时候修改特殊格子的位置。
  }
}
相关文章
|
19天前
|
人工智能 自然语言处理 算法
当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
【2月更文挑战第24天】当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
27 2
当prompt策略遇上分治算法,南加大、微软让大模型炼成“火眼金睛”
|
19天前
|
算法
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
2017级《算法设计与分析》--实验1--分治算法-骨牌铺方格
|
19天前
|
算法
2017级《算法设计与分析》--实验1--分治算法
2017级《算法设计与分析》--实验1--分治算法
|
19天前
|
算法
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-分治算法
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-分治算法
25 0
|
7月前
|
算法 JavaScript
分治算法
分治算法
54 0
|
8月前
|
人工智能 算法
【算法分析与设计】递归与分治策略(二)
【算法分析与设计】递归与分治策略
|
19天前
|
存储 缓存 算法
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
【数据结构与算法】【小白也能学的数据结构与算法】递归 分治 迭代 动态规划 无从下手?一文通!!!
|
8月前
|
算法
算法:分治思想处理归并递归问题
算法:分治思想处理归并递归问题
|
19天前
|
并行计算 算法 索引
数据结构与算法 分治
数据结构与算法 分治
9 0
|
19天前
|
算法 JavaScript
算法(分治、贪心、dp、回溯、分支限界)总结
算法(分治、贪心、dp、回溯、分支限界)总结