[CUGB2017]H.瓜の辣椒

Problem

众所周知,瓜皮讯是个绝对不能接触辣椒的人。只要碰到一点点辣椒,瓜皮讯就会立即退化成光头讯。
现在,他的面前摆着一排水杯(至少有三杯,至多二十杯),其中有几杯里面装的是恐怖的辣椒水。瓜皮讯原本清醒地知道有哪几杯就是辣椒水,但此时皮皮博出现了,他机智地把一排水杯调换了顺序。
这下瓜皮讯万分苦恼,于是他去找究极毒奶白旭东来帮忙预测哪几杯是辣椒水,不巧,白旭东不在家,瓜皮讯找到你,聪明的你能帮助他保住⾃⼰的头发吗?

Input

多组样例输入,请处理到文件末尾。
每组样例开头为一行只含有 01 两个数字的字串 (字串中含有不少于 3 个数字且不多于 20 个数字) ,以空格隔开,表示一排水杯中含有辣椒水的情况。
1 0 1表示:第一杯是辣椒水,第二杯不是辣椒水,第三杯是辣椒水。接下来有 n(n \leqslant 0) 行(n 并不会直接给出),每行表示一个变换。 如 1 3 2 表示: 上次的第一杯变成了这次的第一杯,上次的第三杯变成了现在的第二杯,上次的第二杯变成了这次的第三杯。

Output

对每组样例输出一行,表示最终这一排水杯中哪几个位置是含有辣椒水的,输出数据要求从小到大输出。 如 1 2 3 表示:第一、 二、 三杯是辣椒水。

Sample Input

1 1 1
1 2 3
3 2 1
0 0 0
1 2 3
3 2 1
1 1 1

Sample Output

1 2 3

1 2 3

Hint

看上去简单的模拟题往往坑在输入输出方面。
当前两个数字的乘积小于等于一时就是一个新的样例。
无辣椒水输出空行。

题解

#include "cstdio"
#include "cstdlib"
#include "cmath"
#include "cstring"
#include "iostream"
#include "algorithm"
#include "queue"
// #define debug
using namespace std;
bool bottles[20],fresh = 1;
int len1,len;
int main()
{
    //全局初始化
    #ifdef debug
    freopen("H.in","r",stdin);
    #endif
    queue arr;
    int t;

    //初始化列
    init:
    char c = ' ';
    while(c == ' ')
    {
        scanf("%d",&t);
        arr.push(t);
        c = getchar();
    }
    
    len1 = len;
    len = arr.size();
    int brr[arr.size()];
    if (len < 3)
    {
        while(!arr.empty())
            arr.pop();
        for (int i = 0; i < len1; i++)
            if (bottles[i])
                arr.push(i);
        while (!arr.empty())
        {
            printf(arr.size() == 1 ? "%d" : "%d ",arr.front() + 1);
            arr.pop();
        }
        #ifdef debug
        printf("end\n");
        #endif
        fclose(stdin);
        return 0;
    }
    for (int i = 0; !arr.empty(); i++)
    {
        brr[i] = arr.front();
        arr.pop();
    }

    #ifdef debug
    printf("Status: ");
    for (int i = 0; i < len1; i++)
        printf("%d ",bottles[i]);
    putchar('\n');
    #endif

    //判断是否为新的一排辣椒水
    if (brr[0] * brr[1] <= 1)
    {
        //是
        //先输出之前的结果
        if(fresh == 0)//判断是否为程序初始状态避免多输出一个空行
        {
            for (int i = 0; i < len1; i++)
            {
                if (bottles[i])
                    arr.push(i);
            }
            while (!arr.empty())
            {
                printf(arr.size() == 1 ? "%d" : "%d ",arr.front() + 1);
                arr.pop();
            }
            putchar('\n');

        }
        fresh = 0;
        // printf("\nnew\n");
        //更新状态
        for (int i = 0; i < len; i++)
            bottles[i] = brr[i];
    }
    else
    {
        //不是
        for (int i = 0; i < len; i++)
            arr.push(bottles[brr[i]-1]);
        for (int i = 0; i < len; i++)
        {
            bottles[i] = arr.front();
            arr.pop();
        }
    }
    goto init;
}

CC BY-SA 4.0 [CUGB2017]H.瓜の辣椒 by 小小泥娃 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

发表评论

This site uses Akismet to reduce spam. Learn how your comment data is processed.