P4536 [CQOI2007]三角形

题意

Sierpinski 三角形按照如题意所述分裂,问与某个三角形有共边的所有三角形。

https://cdn.luogu.com.cn/upload/pic/18501.png

解法

我们不难观察出这题只需分类讨论。

  1. 当末尾是 44 时,例如 Taaaaa4,那么与之有共边的有 Taaaaa1Taaaaa2Taaaaa3

  2. 当这个字符串中只有一种不同的从 1144 的数字,例如 T111T112T113,那么与之有共边的有只有 T114

  3. 对于其他,我们只需要遍历整个字符串,找到 112233 一个最后出现的位置,并将这个位置改成 44 即可。

代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 15;

string s, ans[N];
unordered_map<char, bool> mp;

int main()
{
	cin >> s;
	s.erase(s.begin());
	int len = s.size();
	for (int i = 0; i < s.size(); i++) mp[s[i]] = true;
	int tot = mp['1'] + mp['2'] + mp['3'] + mp['4'];
	if (s == "1")
	{
		printf("T4\n");
	}
	else if (s == "2")
	{
		printf("T4\n");
	}
	else if (s == "3")
	{
		printf("T4\n");
	}
	else if (s.back() == '4')
	{
		s.erase(--s.end());
		cout << "T" << s;
		cout << "1\n";
		cout << "T" << s;
		cout << "2\n";
		cout << "T" << s;
		cout << "3\n";
	}
	else
	{
		if (tot == 1)
		{
			s.erase(--s.end());
			cout << "T" << s << "4\n";
			return 0;
		}
		for (int i = 0; i < len; i++)
		{
			if (s[i] == '1') ans[1] = s.substr(0, i);
			else if (s[i] == '2') ans[2] = s.substr(0, i);
			else if (s[i] == '3') ans[3] = s.substr(0, i);
		}
		sort(ans + 1, ans + 4, greater<string>());
		for (int i = 1; i <= 3; i++)
		{
			cout << "T" << ans[i] + "4\n";
		}
	}
	return 0;
}
posted @   HappyBobb  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示