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

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代码


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 arr=new ArrayList<>();
        int n=ss.length;
        for(int i=0;i+1
感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

你可能感兴趣的:(Acwing习题,蓝桥杯,算法)