算法设计与分析/数据结构与算法实验1:棋盘覆盖问题

简介: 算法设计与分析/数据结构与算法实验1:棋盘覆盖问题

1.实验目的

(1)掌握递归与分治法的处理思路与算法框架。

(2)掌握应用递归与分治法解决具体问题的方法。

2.实验内容

(1)问题描述


image.png

(2)输入


image.png

(3)输出

棋盘覆盖的方案。用数组表示棋盘,骨牌块号用数字表示,并输出颜色。

3.问题实例分析


image.png

我们称含“特殊方格”的区域为“特殊区域”。如图所示,1号区域含特殊方格,我们可以称其为“特殊区域”。为了将不含特殊方格的区域转化为特殊区域,可以在这三个区域的交界处放置一个L型骨牌。如图所示。

image.png

当大的特殊棋盘被转化成的特殊棋盘时,其中一个方格是特殊方格,剩下三个方格可以直接被L型骨牌覆盖。事实上,在程序实现时,仍然认为剩下三个区域的交界处被放置一个L型骨牌。如图所示。

在将4个小特殊棋盘覆盖完成后,可以看到完整的大特殊棋盘的效果。

image.png

4.算法描述及说明

数据结构

image.png


5.算法正确性分析


image.png

7.运行结果及展示说明

image.png

8.心得体会

9.程序源代码

#include<iostream>
#include<cmath>
#include<iomanip>
#include<windows.h>
using namespace std;
int tile = 1;
int board[128][128];
void chessboard(int tr, int tc, int dr, int dc, int size) {
  //tr:棋盘左上角方格行号
  //tc:棋盘左上角方格列号
  //dr:特殊方格行号
  //dc:特殊方格列号
  //size:当前棋盘大小
  if (size == 1) return;
  int t = tile++;//L型骨牌号
  int s = size / 2;//子棋盘大小
  //(tr+s-1,tc+s-1)代表左上棋盘的右下角
  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);
  }
}
int main() {
  HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //获取缓冲区句柄,在输出颜色时使用
  int k;
  cout << "请输入棋盘大小:";
  cin >> k;
  int size = pow(2, k);
  int dr, dc;
  cout << "请输入特殊方格坐标:";
  cin >> dr >> dc;
  chessboard(0, 0, dr, dc, size);
  for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
      SetConsoleTextAttribute(hCon, board[i][j]%6+1); //设置文本及背景色,数字设置了输出颜色
      cout <<setw(4)<< board[i][j];
    }
    cout << endl;
  }
  return 0;
}


目录
相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
116 4
|
10天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
47 20
|
9天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
24 6
|
2月前
|
数据采集 存储 算法
Python 中的数据结构和算法优化策略
Python中的数据结构和算法如何进行优化?
|
2月前
|
算法
数据结构之路由表查找算法(深度优先搜索和宽度优先搜索)
在网络通信中,路由表用于指导数据包的传输路径。本文介绍了两种常用的路由表查找算法——深度优先算法(DFS)和宽度优先算法(BFS)。DFS使用栈实现,适合路径问题;BFS使用队列,保证找到最短路径。两者均能有效查找路由信息,但适用场景不同,需根据具体需求选择。文中还提供了这两种算法的核心代码及测试结果,验证了算法的有效性。
110 23
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
3月前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
2月前
|
算法 vr&ar 计算机视觉
数据结构之洪水填充算法(DFS)
洪水填充算法是一种基于深度优先搜索(DFS)的图像处理技术,主要用于区域填充和图像分割。通过递归或栈的方式探索图像中的连通区域并进行颜色替换。本文介绍了算法的基本原理、数据结构设计(如链表和栈)、核心代码实现及应用实例,展示了算法在图像编辑等领域的高效性和灵活性。同时,文中也讨论了算法的优缺点,如实现简单但可能存在堆栈溢出的风险等。
59 0
|
3月前
|
算法
PID算法原理分析
【10月更文挑战第12天】PID控制方法从提出至今已有百余年历史,其由于结构简单、易于实现、鲁棒性好、可靠性高等特点,在机电、冶金、机械、化工等行业中应用广泛。
|
9天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
139 80