这个题说白了还是模拟,不过有很多需要注意的地方,而且也用到了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;
}