青蛙王子的题解

青蛙们正遭遇一次史无前例的危机!为了解救族人,青蛙王子必须完成一个古老而艰难
的游戏——zuma 游戏。
zuma 游戏中,一条通道中有一些玻璃珠,每个珠子有各自的颜色,如图 1 所示。青蛙
王子可以做的是选择一种颜色的珠子射入某个位置。
在这里插入图片描述
图 2 中青蛙王子选择一颗蓝色珠子,射入图示的位置,于是得到一个图 3 的局面。
在这里插入图片描述
在这里插入图片描述
当青蛙王子射入一颗珠子后,如果射入的珠子与其他珠子组成了三颗以上连续相同颜色
的珠子,这些珠子就会消失。例如,将一颗白色珠子射入图 4 中的位置,就会产生三颗颜色
相同的白色珠子。这三颗珠子就会消失,于是得到图 5 的局面。
在这里插入图片描述
在这里插入图片描述
需要注意的一点是,图 4 中的三颗连续的黄色珠子不会消失,因为并没有珠子射入其中。
珠子的消失还会产生连锁反应。当一串连续相同颜色的珠子消失后,如果消失位置左右
的珠子颜色相同,并且长度大于 2,则可以继续消失。例如,图 6 中,射入一颗红色珠子后,
产生了三颗连续的红色珠子。当红色珠子消失后,它左右都是白色的珠子,并且一共有四颗,
于是白色珠子也消失了。之后,消失位置的左右都是蓝色珠子,共有三颗,于是蓝色珠子也
消失。最终得到图 7 的状态。注意,图 7 中的三颗黄色珠子不会消失,因为蓝色珠子消失的
位置一边是紫色珠子,另一边是黄色珠子,颜色不同。
在这里插入图片描述
在这里插入图片描述
除了上述的情况,没有其他的方法可以消去珠子。
现在,请你协助青蛙王子消除通道中的珠子。给出每一轮选择的珠子的颜色、射入的位
置,请你计算出最后还剩下多少颗珠子。

大模拟,不讲。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<int>v;
int main(){
	v.push_back(0);
	int n,m,i;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		int x;
		cin>>x;
		v.push_back(x);
	}
	for(i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		v.insert(v.begin()+y+1,x);
		y++;
		int l=y,r=y;
		while(v[l-1]==v[y]&&l-1>0)l--;
		while(v[r+1]==v[y]&&r+1<v.size())r++;
		if(r-l>1){
			for(int j=l;j<=r;j++)v.erase(v.begin()+l);
			y=l-1;
		}
		while(v.size()>2){
			int l=y,r=y;
			while(v[l-1]==v[y]&&l-1>0)l--;
			while(v[r+1]==v[y]&&r+1<v.size())r++;
			if(r-l+1<3||r==y)break;
			else{
				v.erase(v.begin()+l,v.begin()+r+1);
				y=l-1;
			}
		}
	}cout<<v.size()-1;
	return 0;
}
原文地址:https://www.cnblogs.com/zhaohaikun/p/12816977.html