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

来源:互联网 发布:eclipse 改变端口号 编辑:程序博客网 时间:2024/06/05 16:58

这个题说白了还是模拟,不过有很多需要注意的地方,而且也用到了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 + 3using 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
原创粉丝点击