hdu-2209 dfs
生活随笔
收集整理的這篇文章主要介紹了
hdu-2209 dfs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
翻紙牌游戲
Time Limit: 9000/3000 MS (Java/Others)????Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3784????Accepted Submission(s): 1424
Problem Description 有一種紙牌游戲,很有意思,給你N張紙牌,一字排開,紙牌有正反兩面,開始的紙牌可能是一種亂的狀態(有些朝正,有些朝反),現在你需要整理這些紙牌。但是麻煩的是,每當你翻一張紙牌(由正翻到反,或者有反翻到正)時,他左右兩張紙牌(最左邊和最右邊的紙牌,只會影響附近一張)也必須跟著翻動,現在給你一個亂的狀態,問你能否把他們整理好,使得每張紙牌都正面朝上,如果可以,最少需要多少次操作。
Input 有多個case,每個case輸入一行01符號串(長度不超過20),1表示反面朝上,0表示正面朝上。
Output 對于每組case,如果可以翻,輸出最少需要翻動的次數,否則輸出NO。
Sample Input 01 011
Sample Output NO 1思路:對于1的一定要翻轉,所以可以分兩種情況對于第一張牌翻轉,則接下去改變的牌為1的就要翻轉。對于第一張牌不翻轉,接下去的牌繼續判斷翻轉不翻轉。然后取最小值,若沒有最小值,則說明不能完全翻轉正面。代碼:#include<cstdio> #include<queue> #include<cstring> #include<algorithm> using namespace std;#define inf 0x3f3f3f3 char s[1010]; int a[1010];int dfs(int i,int len,int m) {if(i==len)return a[i-1]?inf:m;if(a[i-1]){a[i-1] = !a[i-1];a[i] = !a[i];a[i+1] = !a[i+1];m++;}dfs(i+1,len,m); } int main() {while(~scanf("%s",s)){int len=strlen(s);for(int i=0; i<len; i++)a[i]=s[i]-'0';int ans=inf;a[0]=!a[0];a[1]=!a[1];ans=min(ans,dfs(1,len,1));for(int i=0; i<len; i++)a[i]=s[i]-'0';ans=min(ans,dfs(1,len,0));if(ans==inf)printf("NO\n");else printf("%d\n",ans);}return 0; }
總結
以上是生活随笔為你收集整理的hdu-2209 dfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL常用命令大全
- 下一篇: zcmu-1201