1066: 消消乐 (删除连续相同的三个字符) C++

题目描述:

一个字符串,如果连续三个都是同一个字母的话,它们将会被消去。
每次只能消去相邻的相同的三个字母。例如aaaabbbc,消去后变成ac。
有些特殊的字符串,消去一次之后还可以再次消去。
例如abbbaa:第一次消去了中间的bbb,变成了aaa,第二次消去aaa,字符串变成空字符串。
现在给你一个长度不超过100的字符串,请你不断地对这个字符串进行消去,直到不能消去为止。

输入格式:

一行,长度不超过100的字符串。

输出格式:

第一行,输出最终剩下的字符串的长度。

第二行,输出最终的字符串

输入样例:

aaaabbbc

输出样例:

2
ac

我的题解:

本题用到栈的知识,将字符一个一个压入栈中,当要进栈的元素和当前栈顶的元素以及栈顶的前一个元素三者均相同时,达到消除条件,此时弹出栈顶元素和栈顶的前一个元素,若不再满足消除条件,则元素进栈。最后记得将最后的栈中元素存入字符串时要翻转字符串,因为栈是先进后出的。

#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;

string myDelete(string S) 
{
    stack<char> st; 
    int sLen = S.length();
    for( int i = 0; i < sLen; i++)
	{ 
		
		if(st.size() >= 2)
		{
			//获取栈顶和栈顶前一个元素的值
			int element1 = st.top();
			st.pop();
			int element2 = st.top();
			st.push(element1);
			if (S[i] == element1 && S[i] == element2)// 可以消除的情况 
			{
				st.pop();
		        st.pop();
		    } 
		    else // 无法消除 压入栈
		    {
		    	st.push(S[i]);
			}
		}
		else // 无法消除 压入栈
		{			
            st.push(S[i]);
        }	
	}
	// 将栈中元素放到ans字符串
    string ans = "";
    while (!st.empty()) 
	{ 
        ans += st.top();
        st.pop();
    }
    reverse (ans.begin(), ans.end()); // 此时字符串需要反转一下
    return ans;
}

int main()
{
	string A;
	cin >> A;
	string B = myDelete(A);
	cout << B.length() << endl;
	for(int i = 0;i < B.length();i++)
	{
		cout << B[i];
	}
	
	return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是用C++编写一个简单的消消乐游戏的步骤。 1. 设计游戏界面 首先,需要设计游戏界面,可以使用ASCII字符来绘制游戏界面,比如一个10行10列的方格,每个方格可以使用一个字符表示。 2. 生成游戏方块 设计游戏方块的类型和颜色,并生成随机的游戏方块。可以使用二维数组来表示游戏方块,数组中的每个元素表示一个游戏方块的类型和颜色。 3. 显示游戏方块 根据生成的游戏方块,将其显示在游戏界面中。可以使用控制台输出函数来显示游戏界面和游戏方块。 4. 实现游戏逻辑 根据消除游戏方块的规则,实现游戏逻辑。比如,当玩家选中两个相邻的游戏方块时,如果它们的类型和颜色相同,则消除这两个游戏方块,并将上面的游戏方块下落,填补消除后的空缺。 5. 实现用户交互 使用键盘输入函数来获取玩家的输入,当玩家选中两个相邻的游戏方块时,触发游戏逻辑,消除游戏方块。 6. 完善游戏功能 添加一些额外的功能,比如计时器、游戏得分、游戏难度等级等等,提高游戏的可玩性。 7. 测试游戏 完成游戏代码后,进行测试,模拟一些常见的情况,验证游戏的稳定性和可玩性。 总之,编写一个消消乐游戏需要经过多个阶段,需要投入大量的时间和精力。但是,只要有兴趣和耐心,就可以写出自己的游戏作品。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值