思路:由于是把所有’?‘号给变成B或者R,所以这题用多源BFS即可,初始化把所有非’?‘的位置入队,对于每个出队元素,将其两边的’?‘变成与出队元素相反的元素即可。
但是需要特判一下,如果开始队列是空,说明全是’?’,你只需要随机找一个点变成任意字母即可,我这里找的是中点
#include<iostream>
#include<cstring>
#include<algorithm>
#include <queue>
using namespace std;
typedef long long LL;
char str[110];
bool h[110];
inline char get(char& c)
{
if(c=='B') return 'R';
return 'B';
}
int main()
{
int T,n;
scanf("%d",&T);
queue<int> q;
while(T--)
{
scanf("%d%s",&n,str);
for(int i=0;i<n;i++)
{
if(str[i]!='?')
{
q.push(i);
h[i]=true;
}
else h[i]=false;
}
if(!q.size())
{
h[n/2]=true;
str[n/2]='B';
q.push(n/2);
}
while(q.size())
{
int t=q.front();
q.pop();
int l=t-1,r=t+1;
if(l>=0&&!h[l])
{
q.push(l);
str[l]=get(str[t]);
h[l]=true;
}
if(r<n&&!h[r])
{
q.push(r);
str[r]=get(str[t]);
h[r]=true;
}
}
puts(str);
}
return 0;
}