链接: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;
	 }
}