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

欧拉计划 Project Euler61(循环的多边形数)题解

欧拉计划 Project Euler 61 题解

  • 题干
  • 思路
  • code

题干

在这里插入图片描述

思路

先生成所有四位数的多边形数集合分类保存,然后dfs找即可

code

// 2512 1281 8128 2882 8256 5625 
// 28684
#include <bits/stdc++.h>using namespace std;using ll = long long;typedef vector<int> vi;
typedef pair<string, vi> PolySet;int triangle(int n) {return n * (n + 1) / 2;
}int square(int n) {return n * n;
}int pentagon(int n) {return n * (3 * n - 1) / 2;
}int hexagon(int n) {return n * (2 * n - 1);
}int heptagon(int n) {return n * (5 * n - 3) / 2;
}int octagon(int n) {return n * (3 * n - 2);
}bool isFourDight(int n) {return n >= 1000 && n <= 9999;
}bool Match(int a, int b) {return (a % 100) == (b / 100);
}bool dfs(vector<vi> &polySets, vector<int> &path, vector<bool> &used, int depth) {if (depth == 6) {return Match(path[5], path[0]);}for (int i = 0; i < 6; ++i) {if (used[i]) continue;for (int num : polySets[i]) {if (Match(path.back(), num)) {used[i] = true;path.push_back(num);if (dfs(polySets, path, used, depth + 1)) return true;path.pop_back();used[i] = false;}}}return false;
}void solve() {map<string, vi> polyNumbers;for (int n = 1; ; ++n) {int t = triangle(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["triangle"].push_back(t);}for (int n = 1; ; ++n) {int t = square(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["square"].push_back(t);}for (int n = 1; ; ++n) {int t = pentagon(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["pentagon"].push_back(t);}for (int n = 1; ; ++n) {int t = hexagon(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["hexagon"].push_back(t);}for (int n = 1; ; ++n) {int t = heptagon(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["heptagon"].push_back(t);}for (int n = 1; ; ++n) {int t = octagon(n);if (t > 9999) break;if (isFourDight(t)) polyNumbers["octagon"].push_back(t);}vector<string> types = {"triangle", "square", "pentagon", "hexagon", "heptagon", "octagon"};sort(types.begin(), types.end());do {vector<vi> polySets;for (string &type : types) {polySets.push_back(polyNumbers[type]);}for (int start : polySets[0]) {vector<int> path = {start};vector<bool> used(6, false);used[0] = true;if (dfs(polySets, path, used, 1)) {int sum = 0;for (int num : path) {cout << num << " ";sum += num;}cout << "\n";cout << sum << "\n";return ;}}} while (next_permutation(types.begin(), types.end()));}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int tt = 1; // cin >> tt;while (tt--) {solve();}return 0;
}

相关文章:

  • Java中的多态与继承
  • 共筑数字经济新生态 共绘数字中国新蓝图 ——思特奇受邀出席2025年第八届数字中国建设峰会
  • 动画震动效果
  • Java 未来技术栈:从云原生到 AI 融合的企业级技术演进路线
  • PCB设计工艺规范(四)安规要求
  • 1254. 【动态规划】单词的划分
  • 动态规划 -- 子数组问题
  • Java大师成长计划之第8天:Java线程基础
  • 农产品园区展示系统——仙盟创梦IDE开发
  • Kotlin与Jetpack Compose的详细使用指南
  • React 第三十六节 Router 中 useParams 的具体使用及详细介绍
  • 力扣hot100——98.验证二叉搜索树
  • Python 数据智能实战 (4):智能用户分群 - 融合行为
  • libevent详解
  • Kubernetes Service 详解
  • 《Ultralytics HUB:开启AI视觉新时代的密钥》
  • 复杂度和顺序表(双指针方法)
  • HOW - 经典详情页表单内容数据填充(基于 Antd 组件库)
  • NLP 分词技术学习
  • Qwen 2.5 VL多模态模型的应用
  • 泽连斯基:美乌矿产协议将提交乌拉达批准
  • 上海与世界|黄菊与上海建设中国式全球城市
  • 对谈|《对工作说不》,究竟是要对什么说不?
  • 如何反击右翼思潮、弥合社会分裂:加拿大大选镜鉴
  • 新疆维吾尔自治区原质量技术监督局局长刘新胜接受审查调查
  • 上海乐高乐园建设进入最后冲刺,开园限量纪念年卡将于5月开售