开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15 天,点击查看活动详情
今天这个递推有点小意思,原来就是个小暴力(bushi),我也没想到我乱搞搞出来了,但是我依旧写的狮山代码,下面放个题目链接
分析
这题别被骗了,其实就是个很简单的暴力,但是我开始受到之前那个翻硬币那题的影响,写的是等于a[1]或者等于之前一项才要翻转,结果第一发就wa了,后来突然想到我的一个思路错了,就是我开始想如果全部能变成W,那就一定能变成B,我少考虑的奇数的情况,然后恍然大悟,不就是先判断能不能全变成W再看能不能变成B,如果都不可以输出-1,否则输出res+step数组的值,然后kkneed代码QAQ,狮山代码,不想再化简了,将就着看吧QAQ~
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <iomanip>
#include <cmath>
#include <unordered_map>
#include <stack>
#include <queue>
#define ll long long
#define lowbit(x) x&(-x)
using namespace std;
typedef pair<int,int> PII;
typedef pair<string,int> PSI;
typedef stack<int> stk;
int gcd(int x,int y){return y?gcd(y,x%y):x;}
ll qmi(ll x,ll y,int mod){
ll res=1;
while(y){if(y&1) res=res*x%mod;y>>=1;x=x*x%mod;}
return res;
}
const int N=210;
int t,n,step[N];
char a[N],b[N];
inline void turn(int i){
if(a[i]=='B') a[i]='W';
else a[i]='B';
if(a[i+1]=='B') a[i+1]='W';
else a[i+1]='B';
}
inline void solve(){
memset(step,0,sizeof step);
cin>>n;
int cnt=0;
int res=0;
scanf("%s",a+1);
for(int i=1;i<=n;i++){
b[i]=a[i];
}
bool ok=0;
for(int i=1;i<n;i++){
if(a[i]!='W'){
turn(i);
res++;
step[++cnt]=i;
}
}
for(int i=1;i<=n;i++){
if(a[i]!='W'){
ok=true;
break;
}
}
if(ok==false){
printf("%d\n",res);
if(res==0) return;
for(int i=1;i<=cnt;i++){
cout<<step[i]<<' ';
}
cout<<"\n";
return;
}
for(int i=1;i<=n;i++) a[i]=b[i];
res=0,cnt=0;
memset(step,0,sizeof step);
for(int i=1;i<n;i++){
if(a[i]!='B'){
turn(i);
res++;
step[++cnt]=i;
}
}
for(int i=1;i<=n;i++){
if(a[i]!='B'){
ok=true;
cout<<"-1\n";
return;
}
}
printf("%d\n",res);
if(res==0) return;
for(int i=1;i<=cnt;i++){
cout<<step[i]<<' ';
}
cout<<"\n";
}
int main(){
cin>>t;
while(t--){
solve();
}
return 0;
}
希望能帮助到大家,QAQ~