分治算法 约定不等于承诺〃 2024-02-17 21:39 207阅读 0赞 #### 问题描述 #### 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。 #### 解题思路 #### 分析:当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为棋盘1×1。 #### 实现 #### 如下图所示:算法chessBoard(tr, tc, dr, dc, size)调用的结果是标记出“左上角坐标(tr,tc)、特殊方格坐标(dr,dc) 、长宽均为size格”区域的L型骨牌覆盖方案。 根据分治的思想将该区域分为相等的4个部分,特殊方格(红色)落在左上1/4区域,图中3个黄色方格则可以看作左下、右上、右下这3个1/4区域的特殊方格,因此算法chessBoard(tr, tc, dr, dc, size)可以递归地分解为以下几步: 将一个L型骨牌覆盖3个黄色方格;//采用对方格标记骨牌号的方式表示覆盖 chessBoard(tr, tc, dr, dc, s); chessBoard(tr+s, tc, tr+s, tc+s-1, s); chessBoard(tr, tc+s, tr+s-1, tc+s, s); chessBoard(tr+s, tc+s, tr+s, tc+s, s); ##### (1)代码实现 ##### \#include <stdio.h> \#include <stdlib.h> int nCount = 0; int Matrix\[100\]\[100\]; void chessBoard(int tr, int tc, int dr, intdc, int size); //声明函数 int main() \{ int size,r,c,row,col; scanf("%d",&size); scanf("%d%d",&row,&col); chessBoard(0,0,row,col,size); for (r = 0; r < size; r++) \{ for (c = 0; c < size; c++) \{ printf("%2d ",Matrix\[r\]\[c\]); \} printf("\\n"); \} return 0; \} void chessBoard(int tr, int tc, int dr, intdc, int size) \{ //tr and tc represent the top left corner's coordinate of the matrix int s,t; if(1 == size) return; s= size/2; //The number ofgrid the matrix's edge t= ++ nCount; //在右下角找到特殊网格 if (dr < tr + s && dc < tc +s) \{ chessBoard(tr,tc,dr,dc,s); \} else \{ Matrix\[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 \{ Matrix\[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 \{ Matrix\[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 \{ Matrix\[tr+s\]\[tc+s\] = t; chessBoard(tr+s,tc+s,tr+s,tc+s,s); \} \} ##### (2)程序结果 ##### 输入 2 1 1,结果如下: ![Center][] 输入 4 1 1,结果如下: ![Center 1][] 输入 8 1 1,结果如下: ![Center 2][] [Center]: https://image.dandelioncloud.cn/pgy_files/images/2024/01/29/45207311a9d340cd9dec9151e38953c9.png [Center 1]: https://image.dandelioncloud.cn/pgy_files/images/2024/01/29/fe995c20b5d745a4a0b2a809d9fb395a.png [Center 2]: https://image.dandelioncloud.cn/pgy_files/images/2024/01/29/27c497cb70444badbe6e873d2a172d8d.png
相关 算法-分治算法 一、分治 1、定义:分治,也就是分而治之。 它的一般步骤是: ① 将原问题分解成若干个规模较小的子问题(子问题和原问题的结构一样,只是规模不一样) 妖狐艹你老母/ 2024年04月08日 10:08/ 0 赞/ 228 阅读
相关 分治算法 问题描述 在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其它方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的L型骨牌覆盖给定的特 约定不等于承诺〃/ 2024年02月17日 21:39/ 0 赞/ 208 阅读
相关 分治算法 思想:将原问题划分成n个规模较小,并且与原问题相似的子问题。递归解决子问题,然后合并结果 要求: 1)原问题与分解成的小问题具有相同的模式 2)小问题可以独立求解 柔情只为你懂/ 2023年06月23日 02:59/ 0 赞/ 27 阅读
相关 分治算法 [概述参考博客地址][Link 1] [算法笔记总目录][Link 2] 一、分治算法的设计思想: 1. 分–将问题分解为规模更小的子问题; 2. 治–将这些规 迈不过友情╰/ 2023年02月18日 01:52/ 0 赞/ 147 阅读
相关 分治算法 划分问题:整个问题划分成多个无关联的子问题。 递归求解:递归调用求解各个子问题。 合并问题:合并子问题的解,形成原始问题的解。 ------------------- 港控/mmm°/ 2022年12月12日 04:58/ 0 赞/ 308 阅读
相关 算法-->分治 package 分治算法; import java.util.Scanner; public class fenzhi \{ static final int MAXN 一时失言乱红尘/ 2022年06月12日 02:06/ 0 赞/ 356 阅读
相关 分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题 柔光的暖阳◎/ 2022年06月05日 06:06/ 0 赞/ 315 阅读
相关 分治算法 分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。即一种分目标完成程序算法,简单问题 港控/mmm°/ 2022年06月03日 02:19/ 0 赞/ 327 阅读
相关 分治算法 可能我太菜了 ,众多题解 的t0\t0 +t1\t2\2始终没看懂 分治大模拟好! include<bits/stdc++.h> using nam 妖狐艹你老母/ 2021年10月24日 00:20/ 0 赞/ 509 阅读
相关 分治算法 一 分治算法介绍 1 分治法是一种很重要的算法 字面上的解释是“分而治之,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……,直 冷不防/ 2021年07月24日 21:35/ 0 赞/ 602 阅读
还没有评论,来说两句吧...