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

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

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';
    }
}

感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下


相关文章
蓝桥杯:递推 例题:数字三角型问题
蓝桥杯:递推 例题:数字三角型问题
58 0
|
算法
[蓝桥杯] 递归与递推习题训练
蓝桥杯比赛只有四十天左右啦,最近会按照模块更新一些有关蓝桥杯算法题。学习算法不仅仅是为了参见比赛,更是以后找工作的一个敲门砖。废话不多说,我们直接看题。
79 0
|
机器学习/深度学习 算法
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
蓝桥杯:递推算法 递归算法 例题:斐波纳契数列
66 0
|
算法
《蓝桥杯每日一题》KMP算法·AcWing 141. 周期
《蓝桥杯每日一题》KMP算法·AcWing 141. 周期
119 0
|
算法
《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指
《蓝桥杯每日一题》哈希·AcWing 2058. 笨拙的手指
68 0
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
《蓝桥杯每日一题》递归·AcWing 1497. 树的遍历
60 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
62 0
|
算法
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
《蓝桥杯每日一题》二分·AcWing 1460. 我在哪?
54 0
|
人工智能
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
《蓝桥杯每日一题》 前缀和·Acwing 3956. 截断数组
68 0
|
算法
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
【AcWing刷题】蓝桥杯专题突破-动态规划-dp入门(17)
117 0