栈与队列,小猫钓鱼

来源:互联网 发布:成都五轴编程招聘 编辑:程序博客网 时间:2024/05/17 03:08
//小哼和小哈玩小猫钓鱼,每人先摸6张牌,小哼先拿牌,然后依次出牌,若牌与桌上的相同则将出的牌放在牌尾,并将之间的牌放入手牌的末尾,否则将牌打至桌上,问谁能获胜。
#include <cstdio>#include <queue>#include <stack>using namespace std; int main() {     queue<int>q1;     queue<int>q2;     stack<int>s;     int i,j,a,n,temp;     int vis[10]={0};//vis数组保存1~9的牌有没有在桌上(栈中),不可能在栈中出现两张相同的牌,否则早就被钓走了     for (i=1;i<=6;i++)     {         scanf("%d",&a);         q1.push(a);     }//小哼拿六张牌     for (i=1;i<=6;i++)     {         scanf("%d",&a);         q2.push(a);     }//小哈拿六张牌     while((!q1.empty())&&(!q2.empty()))//小哼和小哈手上必须都有牌(栈都不为空),否则有一个没牌了,游戏结束     {         temp=q1.front();         q1.pop();//不管赢牌输牌都要把牌先拿出来(如果赢牌就要放在最后,输牌就要放在桌上,反正都不会在这了~~)         if (vis[temp]==1)//如果桌上有这张牌         {            q1.push(temp);//先把这张牌放入小哼的排尾,接下来就是拿桌上的牌            while(s.top()!=temp)//这里注意桌上的大小为temp的牌只可能有一张~~,所以只要栈顶不为temp即可         {             q1.push(s.top());//把桌上的第一张牌拿走放在小哼的排尾             s.pop();         }         vis[temp]=0;//取消标记,桌上没有temp牌了~~         }         if (vis[temp]==0)//如果桌上没有这张牌,别忘了把这张牌放在桌上(之前不要放是因为赢牌了)         {             s.push(temp);             vis[temp]=1;//打上标记,temp牌桌上有了         }         //以上都为小哼的操作         temp=q2.front();         q2.pop();         if (vis[temp]==1)         {             q2.push(temp);             while(s.top()!=temp)            {               q2.push(temp);               s.pop();            }            vis[temp]=0;         }         if (vis[temp]==0)           {               s.push(temp);               vis[temp]=1;           }    }    if (q1.empty())        printf("小哈获胜\n");//小哈手中还有余牌    else        printf("小哼获胜\n");//小哼手中还有余牌    return 0;}


0 0
原创粉丝点击