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。
输入样例:
48BWWWWWWB4BWBB5WWWWW3BWB
输出样例:
36 2 4-1022 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'; } }
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下