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