祖玛消消消(恶心)

【问题描述】

祖玛是一款曾经风靡全球的游戏,其玩法是:在一条轨道上初始排列着若干
个彩色珠子,其中任意三个相邻的珠子不会完全同色。此后,你可以发射珠子到
轨道上并加入原有序列中。一旦有三个或更多同色的珠子变成相邻,它们就会立
即消失。这类消除现象可能会连锁式发生,其间你将暂时不能发射珠子。
开发商最近准备为玩家写一个游戏过程的回放工具。 他们已经在游戏内完成
了过程记录的功能,而回放功能的实现则委托你来完成。
游戏过程的记录中,首先是轨道上初始的珠子序列,然后是玩家接下来所做
的一系列操作。你的任务是,在各次操作之后及时计算出新的珠子序列。

【输入格式】

第一行是一个由大写字母‘A‘~‘Z‘组成的字符串, 表示轨道上初始的珠子序列,
不同的字母表示不同的颜色。
第二行是一个数字?,表示整个回放过程共有?次操作。
接下来的?行依次对应于各次操作。每次操作由一个数字?和一个大写字母?
描述, 以空格分隔。 其中, ?为新珠子的颜色。 若插入前共有?颗珠子, 则? ∈ [0,?]
表示新珠子嵌入之后(尚未发生消除之前)在轨道上的位序。

【输出格式】

输出共?行,依次给出各次操作(及可能随即发生的消除现象)之后轨道上
的珠子序列。
如果轨道上已没有珠子,则以“-”表示。

【样例输入】

ACCBA
5
1 B
0 A
2 B
4 C
0 A

【样例输出】

ABCCBA
AABCCBA
AABBCCBA
-
A

【样例解释】

你以为山里又有座钟神的庙?

【数据规模与约定】

100%的数据满足1 ≤ ? ≤ 10 3 ,1 ≤ ? ≤ 2× 10 3 。

思路:

  这题恶心的要死,神奇的大模拟,钟神说了,这个题要用链表写,但是

    我是一枚渣渣的蒟蒻

  只会用数组来模拟,所以写了一个特别特别直白的模拟

  祖玛这个游戏没怎么玩过,所以,其中有几项消除的规则我是不知道的。。

  代码写起来也非常吃力,但是我还是顽强的写了出来;

  这个消除的情况有很多种,总结以下几种消除方法:

    1.当插入一个元素,前后相同的元素加上插入的元素的个数大于2时会消除;

    2.在1的情况下前后都有相同的元素,并且相同元素的个数大于2时会消除;

    3.在1成立,但2不成立的情况下,已经消除的元素后面的相同的元素个数大于2会消除;

  来,上代码;

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

int n,cur;
char str[6002],ch,vn;

void change(int now)
{
    if(str[now]==0) str[now]=str[now-1];
    else {
        change(now+1);
        str[now]=str[now-1];
    }
}

void qread(int &x)
{
    x=0;vn=getchar();
    while(vn<‘0‘||vn>‘9‘) vn=getchar();
    while(vn>=‘0‘&&vn<=‘9‘){x=x*10+(int)(vn-‘0‘);vn=getchar();}
}

void check(int now,char ty)
{
    int l=now-1,r=now,nl=0,nr=0,pd=0;
    while(1)
    {
        if(str[l]==ty) nl++,l--;
        if(str[r]==ty) nr++,r++;
        if(str[l]!=ty&&str[r]!=ty) break;
    }
    if(nl+nr+1>=3)
    {
        while(1)
        {
            nl=0,nr=0,ty=str[l];
            int ll=l,rr=r;
            int kol;
            while(1)
            {
                kol=0;
                if(str[l]==ty) l--,nl++,kol++;
                if(str[r]==ty) r++,nr++,kol++;
                if(kol==0) break;
            }
            if(nl==0||nr==0||nl+nr<3)
            {
                l=ll,r=rr;
                break;
            }
        }
        while(1)
        {
            int rr=r,kol=0;
            nr=0;
            if(str[r]!=0)
            {
                char op=str[r];
                while(1)
                {
                    if(str[r]==op)
                    {
                        nr++;
                        r++;
                    }
                    else break;
                }
            }
            if(nr<3)
            {
                r=rr;
                break;
            }
        }
        while(1)//因为在第3种情况消除完之后可能会出现第二种情况,所以在用一次处理第二种情况的方法;
        {
            nl=0,nr=0,ty=str[l];
            int ll=l,rr=r;
            int kol;
            while(1)
            {
                kol=0;
                if(str[l]==ty) l--,nl++,kol++;
                if(str[r]==ty) r++,nr++,kol++;
                if(kol==0) break;
            }
            if(nl==0||nr==0||nl+nr<3)
            {
                l=ll,r=rr;
                break;
            }
        }
        int kol=r-l-1;
        for(int i=l+1;i<r;i++) str[i]=0;
        while(str[r]!=0)
        {
            str[r-kol]=str[r];
            str[r]=0;
            r++;
        }
    }
    else
    {
        change(now+1);
        str[now]=ty;
    }
}

void print()
{
    if(str[0]==0)
    {
        putchar(‘-‘);
        putchar(‘\n‘);
        return;
    }
    int kcc=0;
    while(str[kcc]!=0)
    {
        putchar(str[kcc]);
        kcc++;
    }
    putchar(‘\n‘);
}

int main()
{
    gets(str);//因为可能开始序列为空,二维空时cin和scanf都难读入,所以这里用gets
    if(str[0]==‘\n‘) str[0]=0;
    qread(n);
    for(int i=1;i<=n;i++)
    {
        qread(cur);
        cin>>ch;
        check(cur,ch);
        print();
    }
    return 0;
}
时间: 2024-11-03 21:14:13

祖玛消消消(恶心)的相关文章

【POJ1830】开关问题 高斯消元求自由元

#include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/43482357"); } 题意:中文题. 题解: 呃,求自由元个数,然后输出1<<ans:(自由元就是高斯消元消某个变量x时发现以下所有方程当前此位系数都是0) 如果无解输出那个题中给的串. 诶网上代码真不可看,我绝望了决定照自己

SGU 275 To xor or not to xor【最大xor和 高斯消元】

题目大意:给你n个数(n<=100)要你找出若干个数使他们的异或和最大 思路:高斯-若当消元消完以后削成若干个独立的行向量,将它们异或起来就好 #include<cstdio> #include<string.h> #include<iostream> #include<algorithm> #define maxn 3000 #define LL __int64 using namespace std; LL bin[maxn],a[maxn]; i

模板 - 高斯约旦消元法

真丶long double高斯约旦消元法 eps需要取得大一些,以免增加了矩阵的秩. long double可能会慢一些但是无所谓,被卡精度太恶心了. 需要知道一些线代的知识(线代67说你呢!),比如秩.极大线性无关组(线性基)之类的. #include<bits/stdc++.h> #define ll long long using namespace std; namespace Gauss_Jordan_Elimination { const int MAXN=505; const i

【bzoj2844】 albus就是要第一个出场

http://www.lydsy.com/JudgeOnline/problem.php?id=2844 (题目链接) 题意 给出${n}$个数,它们可以异或出${n^2}$个数,将这些数从小到大排列起来,问${Q}$最早出现的位置. Solution 原来线性基还有这种性质,我怎么不知道→_→ 假设${n}$个数可以消出${k}$个线性基,那么显然会有${2^k}$个不同的亦或和,${n}$个数相互排列显然会有${2^n}$个.神奇的事情就在于每种亦或和居然是一样多的,也就是都是${2^{n

线性代数的学习

高斯消元 HDU 3949 XOR 给定一个集合, 求仅使用这个集合中的元素进行异或所能得到的第K小的数是多少. 对整个集合进行一遍高斯消元以后得到的就是原来的集合所在的线性空间的一组基了. 注意这里的高斯消元和解线性方程组时的高斯消元略有不同, 这里的高斯消元在消第i位的时候不止要把所有它后面的向量的第i位都消掉, 也要把它前面所有向量的第i为都消掉, 也就是在最后消出来的集合中每一个数位要不然不出现要不然出现且仅出现了一次.求出来了这个基以后只需要判基中的每一位是不是1就可以了(不在基中的每

看“曹鹏SEO-搜索引擎优化”视频教程笔记

    首先,最值得学习的不是视频中的知识,而是讲者的这几句话 1.本视频中的SEO的方方面面都牵涉到了,只听一遍会增长你的见识,但是更需要再花更多时间去挖掘更多知识和将知识系统化.这当然对于所有知识的学习都很有借鉴意义 2.SEO是一个既前卫又很活跃的学科,它贵在新,贵在经验的积累.信息的及时.很多计算机软件方面的知识都是这样,一方面要扎实的基础,另一方面也不要忘记更跟随知识的更新 以下的笔记是很不全面的,所以要想系统的学好SEO的知识,需要自己在去主动地通过各种途径去学习搜索引擎的原理.爬虫

【霓虹语】マレーシア航空

今年の三月八日.マレーシア航空MH370が地球上から神秘的な消え方で消えてしまいました.これはクアラルンプ—ルから北京までの飛行機です.その中で二百三十九人の乗客が乗っていました.この事件は中国をはじめとして世界中に.大きな関心を呼びました.私も.同じ様に.悲しくて.同情してしまいました. 飛行機の消えた原因は.様々な説があります.それでも.人々が死んだ事実は変わりません. 本来.彼らはそれから飛行機の安全の問題を見直したはずだと思います.でも.事実はそうではありません. 昨日はまた事故が起こり

xcode8 打开的 xib 踩坑

之前开发都不敢工测试版的开发,一直用正式版的,xcode7.3.1的模糊匹配让我很蛋疼,自定义的类,类名不提示,每次都粘贴复制,8号苹果发布了 xcode8GM 版,迫不及待的从苹果开发者官网下了一个安装上,用 xcode8 打开以前创建的 xib 文件类,首先弹出一个框, 然后 xib约束报了一对警告,实在无奈,把警告消掉 消掉之后 xcode8 可以愉快的开发了,确实比 xcode7.3.1好用,可是,还没来的高兴呢,坑来了,使用过 xcode 8打开的xib 跟同事的代码合完之后,同事用的

观物外篇-唐-邵雍:(一)

http://blog.sina.com.cn/s/blog_c187253f010192ri.html 观物外篇-唐-邵雍:(一) 观物外篇 (以<四库全书>本张行成<观物外篇衍义>为主,参以<道藏>本) 天数五,地数五,合而为十,数之全也.天以一而变四,地以一而变四.四者有体也,而其一者无体也,是谓有无之极也.天之体数四而用者三,不用者一也:地之体数四而用者三,不用者一也.是故无体之一以况自然也.不用之一以况道也.用之者三以况天地人也. 体者八变,用者六变.是以八卦