欢迎大家订阅我的专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总贴:USACO历年青铜组真题解析 | 汇总-CSDN博客
【题目来源】
洛谷:[P5833 USACO19DEC] Livestock Lineup B - 洛谷
【题目描述】
每天,Farmer John 都要给他的8 88头奶牛挤奶。她们的名字分别是 Bessie,Buttercup,Belinda,Beatrice,Bella,Blue,Betsy,和 Sue。
不幸的是,这些奶牛相当难以伺候,她们要求 Farmer John 以一种符合N NN条限制的顺序给她们挤奶。每条限制的形式为“X XX必须紧邻着Y YY挤奶”,要求奶牛X XX在挤奶顺序中必须紧接在奶牛Y YY之后,或者紧接在奶牛Y YY之前。
请帮助 Farmer John 求出一种满足所有限制的奶牛挤奶顺序。保证这样的顺序是存在的。如果有多种顺序都满足要求,请输出字典序最小的一种。也就是说,第一头奶牛需要是所有可能排在任意合法奶牛顺序的第一位的奶牛中名字字典序最小的。在所有合法的以这头字典序最小的奶牛为首的奶牛顺序中,第二头奶牛需要是字典序最小的,以此类推。
【输入】
输入的第一行包含N NN。以下N NN行每行包含一句句子,以 “X XXmust be milked besideY YY” 的格式描述了一条限制,其中X XX和Y YY为 Farmer John 的某些奶牛的名字(上文列举了八个可能的名字)。
【输出】
请用8 88行输出一个奶牛的顺序,每行输出一头奶牛的名字,满足所有的限制。如果由多种顺序符合要求,输出字典序最小的奶牛顺序。
【输入样例】
3 Buttercup must be milked beside Bella Blue must be milked beside Bella Sue must be milked beside Beatrice【输出样例】
Beatrice Sue Belinda Bessie Betsy Blue Bella Buttercup【算法标签】
《洛谷 P5833 Livestock Lineup》 #字符串# #USACO# #2019#
【代码详解】
#include<bits/stdc++.h>usingnamespacestd;intn;string a[9]={"","Bessie","Buttercup","Belinda","Beatrice","Bella","Blue","Betsy","Sue"};string b[10];intbook[10]={0};structnode{string x,y;}p[10];voiddfs(intstep)// 排列模板{if(step==8+1){// 排列退出条件intmark=0;// 定义标记位for(inti=1;i<=n;i++){// 遍历输入的n对相邻奶牛组合intpos1,pos2;// 查找两头奶牛的位置for(intj=1;j<=8;j++){// 找到后赋值给pos1和pos2if(b[j]==p[i].x)pos1=j;if(b[j]==p[i].y)pos2=j;}if(abs(pos1-pos2)!=1){// 如果位置之差的绝对值不为1,说明不相邻mark=1;// 修改markbreak;// 退出循环,之后走到return}}if(mark==0){// 如果两层循环下来确定n对奶牛都是相邻的,那说明符合条件for(inti=1;i<=8;i++){// 输出8头奶牛cout<<b[i]<<endl;// 注意换行输出}exit(0);// 退出程序}return;}for(inti=1;i<=8;i++){// 排列模板if(book[i]==0){b[step]=a[i];// 这里这里b[step]要赋值为选择的奶牛名称book[i]=1;dfs(step+1);b[step]="";// 还原现场book[i]=0;}}}intmain(){cin>>n;// 输入nstring tmp;// 定义临时字符串,接受输入多个字符串中的无效信息for(inti=1;i<=n;i++){// 遍历n次输入cin>>p[i].x>>tmp>>tmp>>tmp>>tmp>>p[i].y;// 记录相邻的奶牛组合}sort(a+1,a+8+1);// 对于8个头奶牛的名字按照字典序排序(这样排列出来的,就一定是按照字典序最小的排前面)dfs(1);// 排列模板return0;}【运行结果】
3 Buttercup must be milked beside Bella Blue must be milked beside Bella Sue must be milked beside Beatrice Beatrice Sue Belinda Bessie Betsy Blue Bella Buttercup