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';
}
}
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下