n 个砖块排成一排,从左到右编号依次为 1∼n1。
每个砖块要么是黑色的,要么是白色的。
现在你可以进行以下操作若干次(可以是 00 次):
选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)
你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据第一行包含一个整数 n。
第二行包含一个长度为 n 的字符串 s。其中的每个字符都是 W 或 B,如果第 i� 个字符是 W,则表示第 i号砖块是白色的,如果第 i 个字符是 B,则表示第 i 个砖块是黑色的。
输出格式
每组数据,如果无解则输出一行 −1−1。
否则,首先输出一行 k,表示需要的操作次数。
如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk1,2,…,。其中 pi�� 表示第 i� 次操作,选中的砖块为 pi�� 和 pi+1+1 号砖块。
如果方案不唯一,则输出任意合理方案即可。
数据范围
1≤T≤101≤≤10,
2≤n≤2002≤≤200。
输入样例:
4
8
BWWWWWWB
4
BWBB
5
WWWWW
3
BWB
输出样例:
3
6 2 4
-1
0
2
2 1
思路(y总):
题意:通过翻转,将所有砖块的颜色变得一致。
那么我们可以假定,最后全部反转成白色或者黑色,我们只需要比较每个砖块与我们的目标是否一致,假如,我们想让最后的颜色统一为白色,如果当前的砖块的颜色不是白色,我们便反转一次。例如:下标为0的砖块(也就是第一个)是黑色,但我们目标是白色,那么便翻转一次,而且每一个砖块只能翻转一次,只要翻转就不能再翻了,这样一来,我们现在只用管剩下的n-1个,同理,我们再看下标为1的砖块是否为黑色,如果不是就翻转一次.........一直反转到最后一个,当全部翻转之后,我们判断一下最后一个砖块是否为目标颜色,如果不是则证明不能反转为此颜色,我们再来判断另一种,另一种同理。(还是比较好理解的吧)
源码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 222;
int T,n;
string str;
void turn(char &c)
{
if(c!='W')
c = 'W';
else
c ='B';
}
bool check(char c)
{
vector<int>ans;
string s;
s = str;
for(int i = 0;i+1<n;i++)
{
if(s[i]!=c)
{
turn(s[i]);
turn(s[i+1]);
ans.push_back(i);
}
}
if(s.back()!=c)
return false;
cout<<ans.size()<<endl;
for(int x: ans)
cout<< x + 1<<" ";//注意位置是下标加1
if(ans.size())cout<<endl;
return true;
}
int main()
{
cin>>T;
while(T--)
{
cin>>n>>str;
if(!check('W')&&!check('B'))
cout<<"-1"<<endl;
}
return 0;
}