POJ3087 Shuffle'm Up 循环洗牌(模拟+字符串操作)

在这里插入图片描述
大意就是按图中所示的方式洗牌,把两摞牌交替叠起来,然后再对半分成两摞(下边是S1上边是S2),之后重复进行洗牌,看到达所需情况需要洗牌多少次(不能达到输出-1)

在这里插入图片描述

Sample Input
2
4
AHAH
HAHA
HHAAAAHH
3
CDE
CDE
EEDDCC

Sample Output
1 2
2 -1

注意输出不止需要结果,还需要加上当前的轮数

核心步骤
在这里插入图片描述

代码

#include <iostream>
#include <string>
#include <set>
using namespace std;

set<string> states;

int main()
{
	int times,length,step;
	cin >> times;
	string stack1,stack2,endCondition;
	bool found;
	for(int i=0;i<times;i++)
	{
		cin >> length;
		cin >> stack1;
		cin >> stack2;
		cin >> endCondition;
		
		step=0;
		string temp = "";
		found = false;
		
		while(true)
		{
			for(int i=0;i<length;i++)
				temp = temp+stack2[i]+stack1[i];
			step++;
			if(temp == endCondition) 
			{
				cout << i+1<<" "<< step<<endl;
				found = true;
			}
			if(states.find(temp)!=states.end())  //set数据的唯一性
				break;
			states.insert(temp);
			stack1 = temp.substr(0,length);   // 注意substr的使用
			stack2 = temp.substr(length,length); 
			temp="";
		}
		if(!found)
			cout << i+1 << " "<< -1<<endl;
	}
	return 0;
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值