1.题目描述
n 个砖块排成一排,从左到右编号依次为 1∼n。
每个砖块要么是黑色的,要么是白色的。
现在你可以进行以下操作若干次(可以是 0 次):
选择两个相邻的砖块,反转它们的颜色。(黑变白,白变黑)
你的目标是通过不超过 3n 次操作,将所有砖块的颜色变得一致。
输入格式
第一行包含整数 T,表示共有 T组测试数据。
每组数据第一行包含一个整数 n。
第二行包含一个长度为 n 的字符串 s。其中的每个字符都是 W 或 B,如果第 i 个字符是 W,则表示第 i 号砖块是白色的,如果第 i 个字符是 B,则表示第 i 个砖块是黑色的。
输出格式
每组数据,如果无解则输出一行 −1。
否则,首先输出一行 k,表示需要的操作次数。
如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk。其中 pi 表示第 i次操作,选中的砖块为 pi 和 pi+1号砖块。
如果方案不唯一,则输出任意合理方案即可。
数据范围
1≤T≤10,
2≤n≤200。
输入样例:
4
8
BWWWWWWB
4
BWBB
5
WWWWW
3
BWB
输出样例:
3
6 2 4
-1
0
2
2 1
2.思路分析
这个题的结果不唯一,可以全黑也可以全白,如果无解则输出-1
因为每次反转,都是反转第i位和第i+1位,那么只需遍历到n-1位,
首先将每一位全部反转为白色,如果最后一位与第一位都是白色,那么成功
其次将每一位全部反转为黑色,如果最后一位与第一位都是黑色,那么成功
判断的代码用&&连接,前面一个判断成功就不会执行后面一个
3.Ac代码
-
-
import java.io.*;
-
import java.util.ArrayList;
-
-
public
class
Main {
-
-
public
static
void
main
(String[] args)
throws IOException {
-
BufferedReader
br
=
new
BufferedReader(
new
InputStreamReader(System.in));
-
int
t
= Integer.parseInt(br.readLine());
-
while (t-->
0){
-
int n= Integer.parseInt(br.readLine());
-
String s=br.readLine();
-
if(!check(s,
'W') &&!check(s,
'B')) System.out.println(
"-1");
-
}
-
-
-
}
-
-
static
char []ss;
-
private
static
boolean
check
(String s, char x) {
-
ss=s.toCharArray();
-
ArrayList<Integer> arr=
new
ArrayList<>();
-
int n=ss.length;
-
for(
int i=
0;i+
1<n;i++){
-
if(ss[i]!=x) {
-
update(i);
-
update(i+
1);
-
arr.add(i);
-
}
-
}
-
if(ss[n-
1]!=ss[
0])
return
false;
-
System.out.println(arr.size());
-
for (Integer a : arr) {
-
System.out.print(a+
1+
" ");
//操作下标从1 开始
-
}
-
if(arr.size()!=
0) System.out.println();
-
return
true;
-
}
-
-
private
static
void
update
(int i) {
-
if(ss[i]==
'W'){
-
ss[i]=
'B';
-
}
else ss[i]=
'W';
-
}
-
}
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下
转载:https://blog.csdn.net/m0_68055637/article/details/129092678
查看评论