蓝桥杯算法提高VIP-洗牌

题目

题目链接

题解

STL。


我一开始直接没看懂,因为我理解成取牌堆顶的一张牌放在牌堆里的合适位置,结果不是,是放在手中的合适位置。按我那样错误的理解的话,会无限循环,我就纳闷怎么还能停止,看了题解才发现自己读错题了。


熟悉一遍vector函数的用法:
1.insert
2.pop_back
3.front

代码

#include<bits/stdc++.h>
using namespace std;

int flag, cnt[15];
char ch;
vector<int> v, ans; 

int puke(char ch) {
	if(ch == 'J') return 11;
	if(ch == 'Q') return 12;
	if(ch == 'K') return 13;
	return ch - '0';
}

int main()
{
	while(cin>>ch) {
		if(ch == '0') v.pop_back(), v.push_back(10);
		else v.push_back(puke(ch));
	}
	
	for(int i = 0;i < v.size();i ++) cnt[v[i]] ++;
	for(int i = 1;i <= 13;i ++) if(cnt[i] != 4) flag=1;
	
	if(flag) puts("-1");
	else {
		while(!v.empty()) {
			int t = v.front();
			v.erase(v.begin());
			if(t >= ans.size()) ans.push_back(t);
			else ans.insert(ans.begin()+t, t);
		}	
		
		for(int i = 0;i < ans.size();i ++) {
			if(ans[i] == 13) cout << 'K';
			else if(ans[i] == 12) cout << 'Q';
			else if(ans[i] == 11) cout << 'J';
			else cout << ans[i];
			cout << ' ';
		}
	}

	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不牌不改

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值