lanqiao3

n� 个砖块排成一排,从左到右编号依次为 1∼n1∼�。

每个砖块要么是黑色的,要么是白色的。

现在你可以进行以下操作若干次(可以是 00 次):

选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)

你的目标是通过不超过 3n3� 次操作,将所有砖块的颜色变得一致。

输入格式

第一行包含整数 T�,表示共有 T� 组测试数据。

每组数据第一行包含一个整数 n�。

第二行包含一个长度为 n� 的字符串 s�。其中的每个字符都是 W 或 B,如果第 i� 个字符是 W,则表示第 i� 号砖块是白色的,如果第 i� 个字符是 B,则表示第 i� 个砖块是黑色的。

输出格式

每组数据,如果无解则输出一行 −1−1。

否则,首先输出一行 k�,表示需要的操作次数。

如果 k>0�>0,则还需再输出一行 k� 个整数,p1,p2,…,pk�1,�2,…,��。其中 pi�� 表示第 i� 次操作,选中的砖块为 pi�� 和 pi+1��+1 号砖块。

如果方案不唯一,则输出任意合理方案即可。

#include <iostream>
#include <vector>
#include <cstring>
#include <algorithm>

using namespace std;

int n;
string str;

void update(char& c)
{
    if(c == 'W')  c = 'B';
    else c = 'W';
}

bool check(char c)
{
    vector<int> res;
    string s = str;
    for(int i = 0;i + 1 < n; i++)
    {
        if(s[i] != c)
        {
            update(s[i]);
            update(s[i+1]);
            res.push_back(i);
        }
    }
    if(s.back() != c ) return false;
    
    cout << res.size() << endl;
    for(int x:res)  cout << x+1 << ' ';
    if(res.size()) cout << endl;
     
    return true;
}

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        cin >> n >> str;
        if(! check('W') && ! check('B'))
            puts("-1");
    }
}

learn:

vector  为c语言的向量变量,包含头文件<vector> 中,

.push_back() 为从后添加元素

.size() 为获取向量长度

.back() 获取最后一个元素

for( int x: vector变量 )   可遍历vectot  

翻砖块:

一个位置最多翻转一次(两次及及以上就抵消了)

从第一个位置开始,依次唯一确定其后面的砖块是否要翻转(连续两块),直到最后一块判断其是否为目标值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值