链接:https://ac.nowcoder.com/acm/contest/4462/C
一列上有12个孔,这12个孔中有些孔被遮挡住了。
假定我们用 '-' 来表示没被遮挡住的孔,用 'o' 来表示被遮挡住的孔。
如果相邻的三个孔有两个孔被遮挡,并且被遮挡的两个孔相邻,就是 '-oo' 和 'oo-'。
对于这样的三个孔,我们可以将中间的孔的遮挡物移开,代价是将一端的遮挡物移到另一端没有被遮挡的孔上面。
对于一列给定的孔,你的任务是制定操作的顺序,使得最后剩余的被遮挡的孔的个数最少,并输出最后剩余的被遮挡的孔的个数。
输入描述:
第一行输入一个n, n \le 10^5n,n≤105。
接下来n行,每行12个字符,代表孔的状态。
输出描述:
对于每行输入在一行中输出一个数字代表答案。
示例1
输入
复制
5 ---oo------- -o--o-oo---- -o----ooo--- oooooooooooo oooooooooo-o
输出
复制
1 2 3 12 1
代码
#include<bits/stdc++.h>
using namespace std;
long long n,t,m,r,c,s,l,min1;
char x[10001];
long long a[10001];
void dfs()
{
s=0;
for(int i=1;i<=12;i++)
{
if(a[i]==1)
s++;
}
min1=min(min1,s);
for(int i=1;i<=10;i++)
{
if(a[i]==0&&a[i+1]==1&&a[i+2]==1)
{
a[i+1]=0;
a[i]=1;
a[i+2]=0;
dfs();
a[i+1]=1;
a[i+2]=1;
a[i]=0;
}
else if(a[i]==1&&a[i+1]==1&&a[i+2]==0)
{
a[i+1]=0;
a[i]=0;
a[i+2]=1;
dfs();
a[i+1]=1;
a[i+2]=0;
a[i]=1;
}
}
}
int main()
{
cin>>t;
while(t--)
{
min1=12;
for(int i=1;i<=12;i++)
{
cin>>x[i];
if(x[i]=='-')
a[i]=0;
else
a[i]=1;
}
dfs();
cout<<min1<<endl;
}
}