127 - "Accordian" Patience C++中栈,STL的模拟

这个题说白了还是模拟,不过有很多需要注意的地方,而且也用到了STL模板函数,这里一开始我不会(毕竟没学过C++)网上找了很多资料,看了一晚上,也是码出来了,先说一下大体思路:

先定义牌的结构体,之后用栈堆来模拟牌堆(毕竟输入先进后出的栈原则,定义出stack<struct card>),之后牌堆我们也要将他放在一个集合里,所有我们用到了vector的集合,(vector<stack<strcut card> > cards>),之后就是直接模拟了,从头往尾数,数到符合条件的牌,移动,如果栈堆为空的话,就删除。


一些函数需要清楚,比如 栈 的函数

定义一个栈stack<int>c

往栈顶加入一个元素c.push();

往栈顶删除一个元素c.pop();

返回栈中的实际元素c.size();

查看栈是否为空,如果空的话,返回真值,c.empty();


关于vector的就比较多了,说几个比较常用的

定义一个集合 vector<stack<int> >c; 集合里面的每个元素就可以用c[i].来表示,和集合一样

往集合尾添加元素c.push_back();

返回首元素的地址c.begin();

删除一个元素c.erase();

通常c.erase(vector.begin()+pos);这么用,用首元素定位,删除第pos个元素

返回开头元素,c.front();

对结合初始化c.clear();


下面给出代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<stack>
#define LEN 2 + 3
using namespace std;
struct Card  /*定义一张牌的结构体*/
{
    char x,y;
};
int to_bemove(struct Card card_one,struct Card card_two)
{
    if(card_one.x==card_two.x||card_one.y==card_two.y)
        return 1;
    else
        return 0;
}
int main()
{
     int pos,i,cases;
     char cad[LEN];
     vector<stack<Card> >cards;
     while(true)
     {
         struct Card pat;/*定义一张卡*/
         stack<Card>temp;/*定义一个卡堆*/
         scanf("%s",cad);
         if(strcmp(cad,"#")==0)  break;
         /*使用%s过滤空格*/
         pat.x=cad[0];/*给这张卡附上花色以及点数*/
         pat.y=cad[1];
         temp.push(pat);/*将这张卡加入牌堆*/
         cards.push_back(temp);/*将这堆卡放在桌子上*/
         if(cards.size()==52)
         {
             while(true)
             {
                 for(pos=0;pos<cards.size();pos++)
             {

                if(pos>=3&&to_bemove(cards[pos].top(),cards[pos-3].top()))
                 {
                      cards[pos-3].push(cards[pos].top());
                      cards[pos].pop();
                      break;
                 }
                 else if(pos>=1&&to_bemove(cards[pos].top(),cards[pos-1].top()))
                 {
                      cards[pos-1].push(cards[pos].top());
                      cards[pos].pop();
                      break;
                 }
             }
          if(pos>=cards.size())
                break;
            if(cards[pos].empty())
             {
                 cards.erase(cards.begin()+pos);
                 /*如果卡堆为空,就删除*/
             }
            }
            if(cards.size()==1)
            printf("%d pile remaining:",cards.size());
            else
            printf("%d piles remaining:",cards.size());
            for(i=0;i<cards.size();i++)
            printf(" %d",cards[i].size());
            printf("\n");
            cards.clear();
         }
     }
     return 0;
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值