C 交換遊戲

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章