PTA 纸牌游戏

• 请您模拟纸牌游戏,规则如下:

• 玩家将一副扑克牌一张一张地发牌,从左到右排成一排,不能重叠。只要一张扑克牌和左边的第一张牌或左边的第三张牌相匹配,就将这张扑克牌移被匹配的牌的上面。所谓两张牌匹配是这两张牌的数值(数字或字母)相同或花色相同。每当移了一张牌之后,就再检查看这张牌能否继续往左移,每次只能移在牌堆顶部的牌。本游戏可以将两个牌堆变成一个牌堆,如果根据规则,可以将右侧牌堆的牌一张一张地移到左侧牌堆,就可以变成一个牌堆。本游戏尽可能地把牌往左边移动。如果最后只有一个牌堆,玩家就赢了。

• 在游戏过程中,玩家可能会遇上一次可以有多种选择的情况。当两张牌都可以被移动时,就移动最左边的牌。如果一张牌可以向左移动一个位置或向左移动三个位置,则将其移动三个位置。

输入格式:

输入给出发牌的顺序。每个测试用例由一对行组成,每行给出 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();
	}
}

  • 9
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值