字符遍历
#include <algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<vector>
std::vector<int> ans;//vector 动态数组
//g[65][65]二维矩阵存储 类似无向图 d[65] 标记每个字符出现的次数
int n,g[65][65],d[65];
char str[5];//输入字符
/*
根据相对位置数字转化字符
*/
inline char tochar(int x){
if(x>=1&&x<=26)
return x-1+'A';
else
return x-27+'a';
}
/*
大小写字母转化对应相对位置数字
*/
inline int getnum(char ch){
if(ch>='A'&&ch<='Z')
return ch-'A'+1;
else
return 27+ch-'a';
}
/*
递归存入 动态数组ans中
*/
inline void dfs(int now){
for(int i=1;i<=52;i++){
if(g[now][i]){
g[now][i]=g[i][now]=0;
dfs(i);
}
}
ans.push_back(now);
}
int main(){
int cnt=0,u1=1e9+7,u2=1e9+7;
scanf("%d",&n);//输入几组个字符串
for(int i=1;i<=n;i++){
scanf("%s",str);//输入字符串 固定两个字符
int u=getnum(str[0]),v=getnum(str[1]);//u v表示第一个字符和第二个字符相对位置
g[u][v]=g[v][u]=1;//u 行 v列 v行 u列 都记录 例如:输入ab 则: ab ba都存入
d[u]++;//记录u出现次数
d[v]++;//记录v出现次数
}
for(int i=1;i<=52;i++){
if(d[i]&1){//字母出现奇数次
cnt++;//出现奇数次字母个数
u1=std::min(u1,i);//出现奇数次第一个字母
}else{//字母出现偶数次
if(d[i]!=0)u2=std::min(u2,i);//出现偶数次第一个字母
}
}
if(cnt!=0&&cnt!=2){//出现奇数次的字母个数不是0并且不是2
printf("No Solution\n");
return 0;
}
if(!cnt)//偶数次 从第一个偶数次的字母dfs --cnt为0条件成立 只要累加过都是else
dfs(u2);
else//奇数次 从第一个奇数次字母dfs
dfs(u1);
reverse(ans.begin(),ans.end());//ans反转
for(int i=0;i<ans.size();i++)printf("%c",tochar(ans[i]));//ans输出
return 0;
}
/*
9 ab cd hh od ob bb ba bh ha
6 ab cd hh od bh ha
*/
1 若n=1,则输出结果和输入的str相同 T
解析:n=1 只要两个字母,dfs第一次输出第一个字母,必然找到第2个字母dfs输出 例如:aa dfs(a)--dfs(a)
2 若每次输入的str均为"aa",则输出结果为n+1个'a'拼接而成的字符串 F
解析:若输入的都是aa dfs函数会把a->a对应位置改为0,只能出现一次aa
3 若n>1,且每次输入的str共2n个字符两两不同,则输出"No Solution" T
解析:两两不同,不会被去其他字母改掉,每个字母进行一次dfs 2n个字母所以输出2n字母
4 若n=26,且输入的str依次为"ab","bc","cd",...,"za",则输出结果为"abcd...za" T
解析:ab bc dfs(a)找到b,dfs(b)找到c 此时dfs(b)中的b是ab的b,bc的b就不需要所以输出abc 所以上述是正确的
5 在所有str中,出现奇数次的字母个数为()时,程序不会输出"No Solution" 2
解析:根据 cnt!=0&&cnt!=2 不满足只能是2
6 当输入为"9 ab cd hh od ob bb ba bh ha"时,输出字符串的长度为 9
解析:递归模拟

作者:newcode 更多资源请关注纽扣编程微信公众号

从事机器人比赛、机器人等级考试、少儿scratch编程、信息学奥赛等研究学习

浙公网安备 33010602011771号