小言_互联网的博客

《蓝桥杯每日一题》递推·AcWing 3777. 砖块

372人阅读  评论(0)

1.题目描述

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

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

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

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

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

输入格式

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

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

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

输出格式

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

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

如果 k>0,则还需再输出一行 k 个整数,p1,p2,…,pk。其中 pi 表示第 i次操作,选中的砖块为 pipi+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代码


   
  1. import java.io.*;
  2. import java.util.ArrayList;
  3. public class Main {
  4. public static void main (String[] args) throws IOException {
  5. BufferedReader br = new BufferedReader( new InputStreamReader(System.in));
  6. int t = Integer.parseInt(br.readLine());
  7. while (t--> 0){
  8. int n= Integer.parseInt(br.readLine());
  9. String s=br.readLine();
  10. if(!check(s, 'W') &&!check(s, 'B')) System.out.println( "-1");
  11. }
  12. }
  13. static char []ss;
  14. private static boolean check (String s, char x) {
  15. ss=s.toCharArray();
  16. ArrayList<Integer> arr= new ArrayList<>();
  17. int n=ss.length;
  18. for( int i= 0;i+ 1<n;i++){
  19. if(ss[i]!=x) {
  20. update(i);
  21. update(i+ 1);
  22. arr.add(i);
  23. }
  24. }
  25. if(ss[n- 1]!=ss[ 0]) return false;
  26. System.out.println(arr.size());
  27. for (Integer a : arr) {
  28. System.out.print(a+ 1+ " "); //操作下标从1 开始
  29. }
  30. if(arr.size()!= 0) System.out.println();
  31. return true;
  32. }
  33. private static void update (int i) {
  34. if(ss[i]== 'W'){
  35. ss[i]= 'B';
  36. } else ss[i]= 'W';
  37. }
  38. }
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下


转载:https://blog.csdn.net/m0_68055637/article/details/129092678
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场