首页 > 其他分享 >棋盘覆盖问题——分治法

棋盘覆盖问题——分治法

时间:2023-04-25 23:44:52浏览次数:35  
标签:arr 覆盖 int ChessBoard 分治 方格 骨牌 棋盘

问题描述

有一个 2^kx2^k (k>0)的棋盘,恰好有一个方格与其他方格不同,称之为特殊方格。现在要用如下图所示的L形骨牌覆盖除了特殊方格以外的其他全部方格,骨牌可以任意旋转,并且任何两个骨牌不能重复。请给出一种覆盖方式。

 

样例:

输入:

输出:

 

思路——分治法:

将一个规模为n的问题分解为k个规模较小的子问题,这些子问题相互独立且与原问题相同。

递归地解决这些子问题,然后将各个子问题的解合并得到原问题的解。

就是将规模为n的问题自顶向下分解,直到小问题分解到足够小,可以解决时,再自底向上合并,从而得到原来的解。

 

当k=0(棋盘只有1格),特殊点只能唯一,L骨牌数为0

当k >0,则可将 2*kⅹ2*k 棋盘分割为 4个 2*k-1ⅹ2*k-1 的子棋盘

判断特殊点在哪一个子棋盘中,用一块L骨牌放在其它三个子棋盘的连接处

以此类推,则最后可将每个子棋盘划分为1格的棋盘,结束递归

 

代码实现:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 int arr[1000][1000];
 7 int num = 0;
 8 void ChessBoard(int x, int y, int a, int b, int length);
 9 
10 int main() {
11     //棋盘大小
12     int length;
13     cout << "请输入length:" ;
14     cin >> length;
15 
16     //空白点坐标
17     int a, b;
18     cout << "请输入空格位置:";
19     cin >> a >> b;
20     cout << endl;
21 
22     arr[a][b] = 0;//标点用0表示
23     ChessBoard(1, 1, a, b, length);
24     for (int i = 1; i <= length; i++) {
25         for (int j = 1; j <= length; j++) {
26             cout << arr[i][j] << "   ";
27         }
28         cout << endl;
29     }
30     return 0;
31 }
32 
33 void ChessBoard(int x, int y, int a, int b, int length) {
34     if (length == 1) {
35         return;
36     }
37     int h = length / 2;//分割棋盘
38     int t = ++num;//骨牌号,从1开始,相同数字代表是同一块
39 
40     //以“田”的左下角为(1,1)
41     //左下角
42     if (a < x + h && b < y + h) {
43         ChessBoard(x, y, a, b, h);
44     }
45     else {
46         arr[x + h - 1][y + h - 1] = t;
47         ChessBoard(x, y, x + h - 1, y + h - 1, h);
48     }
49 
50     //左上角
51     if (a < x + h && b >= y + h) {
52         ChessBoard(x, y + h, a, b, h);
53     }
54     else {
55         arr[x + h - 1][y + h] = t;
56         ChessBoard(x, y + h, x + h - 1, y + h, h);
57     }
58 
59     //右下角
60     if (a >= x + h && b < y + h) {
61         ChessBoard(x + h, y, a, b, h);
62     }
63     else {
64         arr[x + h][y + h - 1] = t;
65         ChessBoard(x + h, y, x + h, y + h - 1, h);
66     }
67 
68     //右上角
69     if (a >= x + h && b >= y + h) {
70         ChessBoard(x + h, y + h, a, b, h);
71     }
72     else {
73         arr[x + h][y + h] = t;
74         ChessBoard(x + h, y + h, x + h, y + h, h);
75     }
76 }

参考资料:《计算机算法设计与分析(第四版)》  

标签:arr,覆盖,int,ChessBoard,分治,方格,骨牌,棋盘
From: https://www.cnblogs.com/RyunosukeAkasaka/p/17354348.html

相关文章

  • 分治算法:剑指 Offer 25. 合并两个排序的链表
    题目描述:输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 限制:0<=链表长度<=1000 解题思路:    classSolution{publicListNodemergeTwoLists(ListNodel1,ListNodel2){ListNodedum=newListNode......
  • 洛谷P2241 统计方形 ,棋盘问题升级板,给出格子坐标中矩形以及正方形的计算方法
    在做这道题之前我们先了解一下棋盘问题棋盘问题(qq.com)......
  • [学术讨论] 植被覆盖相关术语与定义探讨
    关键词:植被、盖度、定义、术语作者:ludwig1860日期:2023.4.23最近我在植被覆盖度fCover及其相关量的估算方面的综述论文《Reviewofgroundandaerialmethodsforvegetationcoverfraction(fCover)andrelatedquantitiesestimation:definitions,advances,challenges,......
  • Nginx配置跨域,覆盖后端服务跨域配置
    本篇文章主要介绍了,如何通过Nginx配置跨域,并覆盖后端服务跨域配置。先看下后端代码跨域配置:主要的目标是:不修改后端跨域配置代码,来实现Nginx跨域指定域名。@BeanpublicCorsFiltercorsFilter(){finalUrlBasedCorsConfigurationSourceurlBasedCorsCon......
  • GrassRouter多链路聚合通信系统保障公路网络稳定全面覆盖解决方案
    近年来国内经济不断发展,城市道路交通能力迅速提高,各省市道路交通体系不断完善,促使高速公路运能得到极大提高,公路运输的通达性、舒适性得到明显提高。随着现代化高速公路的建设,新一代无线网络监控系统,已日益成为高速公路监控管理的主要手段。目前高速公路普遍存在各路段监控“信息孤......
  • 覆盖全球的精准 DDoS 检测技术,为全球用户优化游戏体验
    客户背景客户是一家欧洲的游戏公司,拥有多款自主研发的手游和网页游戏。迄今为止,客户已经在欧洲、北美和东亚的多个国家和地区设立了游戏服务区,累计拥有超过3亿的游戏用户,其中海外的用户数量超过1亿,每天在线的用户数量超过2万。客户挑战通过与客户的初步沟通,我们了解到客户的正......
  • AIRIOT物联网平台助力油库自动化升级 实现业务场景全覆盖
     随着我国石油工业的飞速发展,油库规模迅速扩大,油库系统逐渐完善起来。石油行业属于高风险行业,所以石油化工产品在储存、运输和生产各个环节,均有极高的安监、环保、应急的管理要求。通常情况下,油库容量、油品种类、运输周期时间等都是造成危险事故的源头,且发生事故损失......
  • 重载和覆盖
    方法的重载(overload)和覆盖(override 有的时候,类的同一种功能有多种实现方式,到底采用哪种实现方式,取决于调用者给定的参数。例如我们最常用的System.out.println()能够打印出任何数据类型的数据,它有多种实现方式。运行时,Java虚拟机先判断给定参数的类型,然后决定执行哪个......
  • CF1816F Xor Counting - dp - 分治 -
    题目链接:https://codeforces.com/contest/1816/problem/F题解:一道有趣的题。首先发现\(m=1\)和\(m\geq3\)时结论是平凡的。\(m=1\)时结论显然,下面讨论一下\(m\geq3\)时:首先可以构造\([x,(n-x)/2,(n-x)/2,\cdots]\),其中\(x\)和\(n\)同奇偶,显然此时异或值可以......
  • Java中常用算法及示例-分治、迭代、递归、递推、动态规划、回溯、穷举、贪心
    场景1、分治算法的基本思想是将一个计算复杂的问题分成规模较小、计算简单的小问题求解,然后综合各个小问题,得到最终答案。2、穷举(又称枚举)算法的基本思想是从所有可能的情况中搜索正确的答案。3、迭代法(IterativeMethod)无法使用公式一次求解,而需要使用重复结构(即循环)重复执......