原题链接:蓝桥杯2017年第八届真题-拉马车
解题思路:这个题用队列加vector的方法十分容易理解。就是需要考虑清楚每一步的过程.
(当然,这是我小白的时期写的,肯定有很多不对的地方。。。还请多多指正)。
注意事项:
参考代码:
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
queue <char> a;
queue <char> b;
vector <char> c;//公共,用于排火车(我们那边习惯这么叫)
int found()//这个函数的作用是判断当前的牌和之前已经排好的牌有没有一样的
{
for(int i=0;i<c.size()-1;i++)
{
if(c[i]==c.back())
return i;
}
return inf;
}
void print()// 最后打印结果的函数
{
if(a.empty())
{
while(!b.empty())
{
cout<<b.front();
b.pop();
}
}
else if(b.empty())
{
while(!a.empty())
{
cout<<a.front();
a.pop();
}
}
}
void match()// 最主要的函数
{
int flag=1;
while(a.size()!=0&&b.size()!=0)
{
if(flag%2==1)//a出牌
{
if(!c.empty()) // 如果公共牌库不是空的,那么就要判断有无相同的牌了
{
c.push_back(a.front());
a.pop();
int temp=found();
if(temp!=-1)
{
for(int i=c.size()-1;i>=temp;i--)
a.push(c[i]);
c.erase(c.begin()+temp,c.end());
flag--;// 再加上后面的flag++,就是还是轮到a
}
}
else// 如果是空的,那就直接往里面扔牌
{
// cout<<1;
c.push_back(a.front());
a.pop();
//cout<<a.size();
}
}
else//b出牌
{
if(!c.empty())
{
c.push_back(b.front());
b.pop();
int temp=found();
if(temp!=-1)
{
for(int i=c.size()-1;i>=temp;i--)
b.push(c[i]);
c.erase(c.begin()+temp,c.end());
flag--;
}
}
else
{
c.push_back(b.front());
b.pop();
}
}
// print();
// cout<<endl;
flag++; // 这样用一个flag就可以在A、B间来回更替~~
// cout<<a.size()<<endl;
// cout<<b.size();
}
}
int main()
{
string sa,sb;
cin>>sa>>sb;
for(int i=0;i<sa.size();i++)
{
a.push(sa[i]);
}
for(int i=0;i<sb.size();i++)
{
b.push((sb[i]));
}
match();
print();
return 0;
}0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复