hdu 2209 翻紙牌遊戲

Problem Description

有一種紙牌遊戲,很有意思,給你N張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態(有些朝正,有些朝反),現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌(由正翻到反,或者有反翻到正)時,他左右兩張紙牌(最左邊和最右邊的紙牌,只會影響附近一張)也必須跟着翻動,現在給你一個亂的狀態,問你能否把他們整理好,使得每張紙牌都正面朝上,如果可以,最少需要多少次操作。

Input

有多個case,每個case輸入一行01符號串(長度不超過20),1表示反面朝上,0表示正面朝上。

Output

對於每組case,如果可以翻,輸出最少需要翻動的次數,否則輸出NO。

Sample Input

01
011

Sample Output

NO
1

一個翻紙牌的遊戲, 是一個dfs的題目, 我還是很不懂, 後來看了大神的博客。 
一個很好的思路就是判斷第一張牌是翻了還是沒有,對應兩次搜索,尋找最小的次數,
如果都不能 則就輸出NO了。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
using namespace std;
char s[25];
int q[25];
int qq=9999999;
int dfs(int i,int l,int t)
{
	if(i==l)
	{
		return q[i-1]?qq:t;
	}
	if(q[i-1])
	{
		q[i-1]=!q[i-1];
		q[i]=!q[i];
		q[i+1]=!q[i+1];
		t++;
	}
	dfs(i+1,l,t);		
}
int main()
{
	while(~scanf("%s",s))
	{
		int ll=strlen(s);
		for(int i=0;i<ll;i++)
		{
			q[i]=s[i]-'0';
		}
		q[0]=!q[0];//修改第一個了的
		q[1]=!q[1];
		int ans=dfs(1,ll,1); 
		
		for(int i=0;i<ll;i++)
		{
			q[i]=s[i]-'0';
		}
		ans=min(ans,dfs(1,ll,0));
		if(ans==qq)
		printf("NO\n");
		else printf("%d\n",ans);
	}
	
	return 0;
}



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