棋盘覆盖问题——分治法

问题描述

有一个 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 }

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

原文链接:https://www.cnblogs.com/RyunosukeAkasaka/p/17354348.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:棋盘覆盖问题——分治法 - Python技术站

(0)
上一篇 2023年4月25日
下一篇 2023年4月30日

相关文章

  • 详解KMP算法以及python如何实现

    详解KMP算法以及Python如何实现 KMP算法是一种字符串匹配算法,它的全称是Knuth-Morris-Pratt算法,是由Donald Knuth、Vaughan Pratt和James H. Morris位计算科学家于1977年联合发明的。KMP算法的主要思想是利用已知信息来避免无效的字符比较从而提高字符串匹配的效率。本文将详细讲解KMP算法的原理实…

    python 2023年5月13日
    00
  • PHP常用算法和数据结构示例(必看篇)

    PHP常用算法和数据结构示例(必看篇)攻略 在这篇文章中,我们将会学习一些PHP常用的算法和数据结构,并通过一些示例来说明它们的应用场景和使用方法。 1. 哈希表 哈希表是一种常用的数据结构,它根据关键码值(Key Value)而直接进行访问的数据结构。哈希表通常用于实现关联数组。PHP中提供了内置的哈希表数据结构Map和Array。 1.1 使用Map实现…

    数据结构 2023年5月17日
    00
  • 深入解析MySQL索引数据结构

    深入解析MySQL索引数据结构 MySQL索引是优化查询效率的重要一环,本文将深入解析MySQL索引数据结构,帮助读者理解MySQL索引原理,并通过两个示例说明不同类型的索引在实际应用中的效果。 索引数据结构 MySQL支持两种类型的索引数据结构:B-Tree索引和Hash索引。 B-Tree索引 B-Tree索引是MySQL常用的索引类型,用于优化WHER…

    数据结构 2023年5月17日
    00
  • Python代码实现KNN算法

    Python代码实现KNN算法 KNN(K-Nearest Neighbors)是一种常用的分类算法,它的基本思想是:对于一个未知样本,找与最近的K个已知样本,然后根据这K个样本的类别进行分类。Python中,可以使用scikit-learn库实现KNN分类算法。本文将详细讲解Python实现KNN分类算法的完整攻略,包括算法原理、Python实现过程和示例…

    python 2023年5月13日
    00
  • Python优化算法之遗传算法案例代码

    下面是关于“Python优化算法之遗传算法案例代码”的完整攻略。 1. 遗传算法简介 遗传算法是一种基于自然选择和遗传学原理的优化算法,它通过模拟自然界中的进化过程,从而实现对问题的优化。遗传算法的基本思想是将问题转化为染色体编码,然后通过交叉、变异等操作,不断优化染色体,从而得到最优解。 2. Python实现遗传算法 在Python中,我们可以使用 DE…

    python 2023年5月13日
    00
  • Golang实现数据结构Stack(堆栈)的示例详解

    Golang实现数据结构Stack(堆栈)的示例详解 什么是Stack? Stack,也称为堆栈,是一种先进后出(Last In First Out, LIFO)的数据结构。举个例子,比如一堆书,你按照一定的顺序叠起来,然后你想要拿出第一本,你需要先拿掉上面的书才能取到下面的。这就是典型的堆栈模型。 在编程中,Stack也是一种非常常见的数据结构,特别是在函…

    数据结构 2023年5月17日
    00
  • Python使用三种方法实现PCA算法

    PCA(Principal Component Analysis)是一种常用的数据降维算法,它可以将高维数据转换为低维数据,同时保留数据的主要特征。Python中,我们可以使用三种方法来实现PCA算法。 方法一:使用Numpy实现PCA算法 以下是使用Numpy实现PCA法的Python代码示例: import numpy as np def pca(X, …

    python 2023年5月13日
    00
  • python实现ROA算子边缘检测算法

    下面是详细讲解“Python实现ROA算子边缘检测算法”的完整攻略,包括ROA算子的定义、ROA算子的实现、ROA算子的应用和两个示例说明。 ROA算子定义 ROA算子是一种基于局部方向性的边缘检测算法,它可以检测出图像中的边缘,并且可以保留边缘的方向信息。ROA算子的核心思想是在图像中寻找像素点的局部方向,并将其与周围像素点的方向进行比较,从而确定该像素点…

    python 2023年5月14日
    00
合作推广
合作推广
分享本页
返回顶部