• 请您模拟纸牌游戏,规则如下:
• 玩家将一副扑克牌一张一张地发牌,从左到右排成一排,不能重叠。只要一张扑克牌和左边的第一张牌或左边的第三张牌相匹配,就将这张扑克牌移被匹配的牌的上面。所谓两张牌匹配是这两张牌的数值(数字或字母)相同或花色相同。每当移了一张牌之后,就再检查看这张牌能否继续往左移,每次只能移在牌堆顶部的牌。本游戏可以将两个牌堆变成一个牌堆,如果根据规则,可以将右侧牌堆的牌一张一张地移到左侧牌堆,就可以变成一个牌堆。本游戏尽可能地把牌往左边移动。如果最后只有一个牌堆,玩家就赢了。
• 在游戏过程中,玩家可能会遇上一次可以有多种选择的情况。当两张牌都可以被移动时,就移动最左边的牌。如果一张牌可以向左移动一个位置或向左移动三个位置,则将其移动三个位置。
输入格式:
输入给出发牌的顺序。每个测试用例由一对行组成,每行给出 26张牌,由单个空格字符分隔。输入文件的最后一行给出一个 # 作为其第一个字符。每张扑克牌用两个字符表示。第一个字符是面值( A=Ace , 2-9 , T=10 , J=Jack , Q=Queen , K=King ),第二个字符是花色( C= Clubs (梅花), D=Diamonds (方块), H=Hearts(红心), S=Spades (黑桃))。
输出格式:
对于输入中的每一对行(一副扑克牌的 52 张牌),输出一行,给出在对应的输入行进行游戏后,每一堆扑克牌中剩余的扑克牌的数量。
输入样例:
QD AD 8H 5S 3H 5H TC 4D JH KS 6H 8S JS AC AS 8D 2H QS TS 3S AH 4H TH TD 3C 6S
8C 7D 4C 4S 7S 9H 7C 5D 2S KD 2D QH JD 6D 9D JC 2C KH 3D QC 6C 9S KC 7H 9C 5C
AC 2C 3C 4C 5C 6C 7C 8C 9C TC JC QC KC AD 2D 3D 4D 5D 6D 7D 8D TD 9D JD QD KD
AH 2H 3H 4H 5H 6H 7H 8H 9H KH 6S QH TH AS 2S 3S 4S 5S JH 7S 8S 9S TS JS QS KS
#
输出样例:
6 piles remaining: 40 8 1 1 1 1
1 piles remaining: 52
题目大意:
给你52张纸牌,若你左侧第三堆或第一堆的牌顶,和当前牌的数字或者花色相同,则可以将当前纸牌移动到前面的牌堆顶。
思路:
使用vector套stack维护每堆牌堆。
stack<string>st;
st.push(s);
v.push_back(st);
num ++;
if(num <= 51)continue ;
可以对每堆牌进行判断,若当前牌堆顶的牌可以向前移动,则重新从第一堆牌开始判断。
若牌堆为空,则删除该牌堆。
while(now < v.size()){
bool f = 0;
if(now - 3 >= 0 && (v[now].top()[0] == v[now-3].top()[0] || v[now].top()[1] == v[now-3].top()[1])){
f = 1;
v[now-3].push(v[now].top());
v[now].pop();
}else if(now - 1 >= 0 && (v[now].top()[0] == v[now-1].top()[0] || v[now].top()[1] == v[now-1].top()[1])){
f = 1;
v[now-1].push(v[now].top());
v[now].pop();
}
if(f){
if(v[now].size() == 0)v.erase(v.begin()+now);
now = 0;
}else now ++;
}
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n , m , T ;
int main(){
string s;
ll num = 0;
vector<stack<string>>v;
while(cin >> s && s != "#"){
stack<string>st;
st.push(s);
v.push_back(st);
num ++;
if(num <= 51)continue ;
ll now = 0;
while(now < v.size()){
bool f = 0;
if(now - 3 >= 0 && (v[now].top()[0] == v[now-3].top()[0] || v[now].top()[1] == v[now-3].top()[1])){
f = 1;
v[now-3].push(v[now].top());
v[now].pop();
}else
if(now - 1 >= 0 && (v[now].top()[0] == v[now-1].top()[0] || v[now].top()[1] == v[now-1].top()[1])){
f = 1;
v[now-1].push(v[now].top());
v[now].pop();
}
if(f){
if(v[now].size() == 0)v.erase(v.begin()+now);
now = 0;
}else now ++;
}
ll sum = 0;
for(int i = 0 ; i < v.size() ; i ++)if(v[i].size())sum ++;
cout << sum << " piles remaining:";
for(int i = 0 ; i < v.size() ; i ++)if(v[i].size())cout << " " << v[i].size();
num = 0;cout << endl;v.clear();
}
}