当前位置: 首页 > news >正文

算法竞赛进阶指南 # 递推与递归 # 分型

题目链接

链接:AcWing 118. 分形

思路

不难发现,\(n\) 级图形的长度为 \(3^{n-1}\),且 \(n\le 7 \implies 3^{n-1} < 10^3\),于是可以开辟大小为 \(10^3\) 的二维布尔数组 \(a\) 与图形对应。

  • \(a[i][j]=0\):表示该位置为空;
  • \(a[i][j]=1\):表示该位置为 'X'

\(n\) 级图形的长度为 \(m\),则 \(n-1\) 级的图像长度

\[size=\frac{m}{3} \]

从左上角 \((x,y)=(0,0)\) 开始递归。 由于 \(n\) 级图形由 \(5\)\(n-1\) 级图形构成,于是需要 \(5\) 个递归分支,分别对应 \(n-1\) 级问题的左上角坐标。

  • 左上角:递归到 \((size, x,y)\)
  • 右上角:递归到 \((size, x, y + 2 \cdot size)\)
  • 中间:递归到 \((size, x + size, y + size)\)
  • 左下角:递归到 \((size, x + 2 \cdot size, y)\)
  • 右下角:递归到 \((size, x + 2 \cdot size, y + 2 \cdot size)\)

\(size=1\) 时,递归到简单情况,设置 \(a[x][y]=1\) 即可。

代码

#include <bits/stdc++.h>
using namespace std;constexpr int N = 1010;vector<vector<bool>> g(N, vector<bool>(N));void dfs(int m, int x, int y) {if (m == 1) {g[x][y] = 1;return;}int size = m / 3;dfs(size, x, y);dfs(size, x, y + 2 * size);dfs(size, x + size, y + size);dfs(size, x + 2 * size, y);dfs(size, x + 2 * size, y + 2 * size);
}int main() {int n;while (scanf("%d", &n) == 1 && n != -1) {for (int i = 0; i < N; i++)fill(g[i].begin(), g[i].end(), 0);int m = 1;for (int i = 1; i < n; i++)m *= 3;dfs(m, 0, 0);for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (g[i][j]) putchar('X');else putchar(' ');}puts("");}puts("-");}return 0;
}

递归时间复杂度分析

长度 \(n\) 的问题于规模为 \(n-1\) 的关系满足

\[T(m) = 5T(\frac{m}{3}) + O(1) \]

忽略 \(O(1)\),并展开 \(k\) 次,直到 \(m=1\),于是

\[T(m) = 5T(\frac{m}{3}) = 5^2(\frac{m}{3 ^ 2}) = ... = 5^k(\frac{m}{3 ^ k}) \implies m = 3^k \implies k = \log_3{m} \]

于是

\[T(m) = 5^{\log_3{m}} \]

\(m = 3^{n-1}\),于是

\[T(n)= O(5^{n-1}) \]

优化

注意观察图形,事实上,我们只需一次递归求出左上角图形的状态,然后根据分型规律,复制到其他 \(4\) 个部分即可。

#include <bits/stdc++.h>
using namespace std;constexpr int N = 1010;vector<vector<bool>> g(N, vector<bool>(N));void dfs(int m) {if (m == 1) {g[0][0] = 1;return;}dfs(m / 3);int dx[] = {0, 1, 2, 2};int dy[] = {2, 1, 0, 2};int size = m / 3;for (int k = 0; k < 4; k++) {for (int i = 0; i < size; i++) {for (int j = 0; j < size; j++) {g[i + dx[k] * size][j + dy[k] * size] = g[i][j];}}}
}int main() {int n;while (scanf("%d", &n) == 1 && n != -1) {for (int i = 0; i < N; i++)fill(g[i].begin(), g[i].end(), 0);int m = 1;for (int i = 1; i < n; i++)m *= 3;dfs(m);for (int i = 0; i < m; i++) {for (int j = 0; j < m; j++) {if (g[i][j]) putchar('X');else putchar(' ');}puts("");}puts("-");}return 0;
}
http://www.jsqmd.com/news/402299/

相关文章:

  • ChatGPT显示‘请安装最新版Google Play‘错误的底层分析与解决方案
  • 2026郭氏正骨靠谱推荐,帮你找到心仪之选,郭氏正骨,郭氏正骨供应商哪家好 - 品牌推荐师
  • 为什么知网、维普、万方查AI率结果都不一样?三大平台检测差异深度解析
  • 格式总出错?8个AI论文工具测评:本科生毕业论文写作与格式规范全攻略
  • 从入门到精通:Git核心命令详解与高效开发实战指南
  • 建议收藏|9个一键生成论文工具深度测评:MBA毕业论文+开题报告高效写作指南
  • 生成式 AI 在智能客服系统中的复杂问题解答:架构设计与性能优化实战
  • CosyVoice 5090部署实战:从环境配置到性能调优全指南
  • 从零构建客服智能体:基于Coze的快速入门与实战避坑指南
  • 基于C++和Qt的毕业设计实战:从项目选题到可交付应用的完整路径
  • 智能客服agent系统实战:从架构设计到高并发优化
  • 2026年春节期间见闻与感悟
  • 智能客服系统入门指南:从核心原理到生产环境部署
  • JAVA面试题速记-redis知识点
  • 基于密度的聚类(HDBSCAN)在智能客服中的实战应用与性能优化
  • 计算机毕业设计智能体客服助手:从技术选型到生产环境部署全指南
  • 智能客服产品AI辅助开发实战:从意图识别到对话管理优化
  • PyCharm集成ChatGPT实战:AI辅助开发的效率革命与避坑指南
  • 好用的2026板材十大品牌哪家专业 - 品牌推荐(官方)
  • 2025年板材十大品牌前五名的口碑企业 - 品牌推荐(官方)
  • 聊天机器人毕设实战:从零构建高可用对话系统的技术路径与避坑指南
  • 基于微信小程序的地方非遗展示与传播毕业设计资料:技术选型、架构实现与性能优化指南
  • 2026年1月,这几家评价好的现浇搭建公司别错过!现浇钢筋混凝土/现浇楼梯/现浇钢筋混凝土楼梯,现浇搭建公司找哪家排行 - 品牌推荐师
  • 基于CosyVoice 3论文的语音合成效率优化实战
  • 基于Qwen3-Coder构建开源智能客服系统的技术实践与性能优化
  • 基于Dify Agent构建智能客服:攻克知识库查询与多轮对话的工程实践
  • 数据分析系统毕设入门指南:从零搭建可扩展的轻量级架构
  • 基于大模型的智能客服系统设计方案:从架构设计到生产环境落地
  • 校园跑腿业务系统毕设:从零搭建一个高可用的轻量级订单调度服务
  • 计算机毕业设计深度学习:从选题到部署的避坑指南与技术实践