小猫钓鱼-----队列与栈的结合
问题描述
星期天xiaoheng和xiaoha约在一起玩桌游,他们正在玩一个非常古怪的扑克游戏–“小猫钓鱼”
游戏的规则是这样的:将一副扑克牌平均分成两份,每人拿一份。xiaoheng先拿出手中的第一张扑克牌放在桌上,然后xiaoha也拿出手中的第一张扑克牌,并放在xiaoheng刚打出的扑克牌上面,就像这样两人交替出牌。出牌时,如果某人打出的牌与桌上的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依次放到自己手中牌的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。
假如游戏开始时,xiaoheng手中有6张牌,顺序为2 4 1 2 5 6,xiaoha手中有6张牌,顺序为3 1 3 5 6 4
最终谁会获胜呢?现在你可以拿出来试一试。
接下来请你写一个程序来自动判断谁将获胜。这里我们做一个约定,xiaoheng和xiaoha手中拍的牌面只有1~9。
输入
只有两行数,每行6个数字(1~9)
输出
第一行:获胜者的名字xiaoha或xiaoheng
第二行:获胜者手里的牌
第三行:桌面剩下的牌
样例输入
2 4 1 2 5 6
3 1 3 5 6 4
样例输出
xiaoha
1 6 5 2 3 4 1
3 4 5 6 2
#include<iostream>
#include<queue>
using namespace std;
int main()
{
queue<int> xheng;//定义xiaoheng的队列
queue<int> xha;//定义xiaoha的队列
int a,temp[100000],c=0;//定义桌面栈
for(int i=1;i<=6;i++)
{
cin>>a;
xheng.push(a);//将牌依次放入xiaoheng的队列中
}
for(int i=1;i<=6;i++)
{
cin>>a;
xha.push(a);//将牌依次放入xiaoha的队列中
}
while(!xheng.empty()&&!xha.empty())//只要其中一人队列不为空就继续循环
{
// xiaoheng出牌 //
int t1;
t1=xheng.front();//取xiaoheng队首元素
xheng.pop();//将xiaoheng队首元素弹出
temp[++c]=t1;//将队首元素放入桌面栈中
int size=c-1;
for(int i=1;i<=size;i++)//从队首开始遍历至队尾之前的元素
{
if(temp[i]==t1)//如果栈中有相同的元素
for(int j=size+1;j>=i;j--)
{
xheng.push(temp[c--]);//从次此元素开始至栈顶依次全部放入xiaoheng的队尾
temp[c+1]=0;//将栈中弹出的元素标记为0
}
}
if(xheng.empty())//此时如果xiaoheng的队列为空,跳出循环
{ //否则让xiaoha出牌
break;
}
// xiaoha出牌 //
int t2; //xiaoha出牌方式与xiaoheng一样不在赘述
t2=xha.front();
xha.pop();
temp[++c]=t2;
size=c-1;
for(int i=1;i<=size;i++)
{
if(temp[i]==t2)
for(int j=size+1;j>=i;j--)
{
xha.push(temp[c--]);
temp[c+1]=0;
}
}
if(xha.empty())
{
break;
}
}
if(xheng.empty()) //判断如果xiaoheng队列为空则xiaoha赢
{
cout<<"xiaoha"<<endl;
int size1=xha.size();
for(int i=1;i<=size1;i++) //遍历输出xiaoha队列元素
{
cout<<xha.front()<<' ';
xha.pop();
}
}
else if(xha.empty()) 判断如果xiaoha队列为空则xiaoheng赢
{
cout<<"xiaoheng"<<endl;
int size1=xheng.size();
for(int i=1;i<=size1;i++) //遍历输出xiaoheng队列元素
{
cout<<xheng.front()<<' ';
xheng.pop();
}
}
cout<<endl;
for(int i=1;i<=c;i++) //遍历输出桌面栈中元素
{
cout<<temp[i]<<' ';
}
cout<<endl;
}