打卡信奥刷题(2426)用C++实现信奥 P1341 无序字母对

P1341 无序字母对

题目描述

给定 nnn 个各不相同的无序字母对(区分大小写,无序即字母对中的两个字母可以位置颠倒)。请构造一个有 (n+1)(n+1)(n+1) 个字母的字符串使得每个字母对都在这个字符串中出现。

输入格式

第一行输入一个正整数 nnn

第二行到第 (n+1)(n+1)(n+1) 行每行两个字母,表示这两个字母需要相邻。

输出格式

输出满足要求的字符串。

如果没有满足要求的字符串,请输出 No Solution

如果有多种方案,请输出字典序最小的方案(即满足前面的字母的 ASCII 编码尽可能小)。

输入输出样例 #1

输入 #1

4
aZ
tZ
Xt
aX

输出 #1

XaZtX

说明/提示

不同的无序字母对个数有限,nnn 的规模可以通过计算得到。

C++实现

#include<cstdio>
#include<cstring>
int a[106],c[10006],du[101],n,x,y,
    k=0xfffffff,tot;
bool b[106][106];
char s[2];
int min(int u,int v) {
	return u<v ? u:v;
}
void dfs(int u) {
	for(int i=0; i<58; i++)/*A到z之间还有一些字符,总共58个*/ {
		if(b[u][i]) {
			b[u][i]=b[i][u]=0;
			dfs(i);
		}
	}
	c[++tot]=u;
}
int main() {
	scanf("%d",&n);
	for(int i=1; i<=n; i++)	{
		scanf("%s",&s);
		x=s[0]-'A';
		y=s[1]-'A';/*字符串从零开始读入*/
		k=min(k,min(x,y));
		b[x][y]=b[y][x]=1;
		du[x]++;
		du[y]++;
	}
	for(int i=0; i<58; i++)
		if(du[i]%2==1)
			a[++a[0]]=i;
	if(a[0]==0) dfs(k);
	else if(a[0]==2) dfs(a[1]);
	else	{
		printf("No Solution\n");
		return 0;
	}
	for(int i=tot; i>=1; i--)
		printf("%c",c[i]+'A');
	return 0;
}



在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值