HDU2209:翻纸牌游戏(DFS)
2013-11-03 14:52
627 查看
Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
Sample Input
Sample Output
很简单的DFS,只要分析胡两个状态,一个是第一张牌翻了,一个是第一张牌没有翻转,求出最小的次数即可
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
Sample Input
01 011
Sample Output
NO 1
很简单的DFS,只要分析胡两个状态,一个是第一张牌翻了,一个是第一张牌没有翻转,求出最小的次数即可
#include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <stdlib.h> using namespace std; const int inf = 1<<30; char str[30]; int a[30]; 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() { int i,ans,len; while(~scanf("%s",str)) { len = strlen(str); ans = inf; for(i = 0; i<len; i++) a[i] = str[i]-48; a[0]=!a[0]; a[1]=!a[1]; ans = min(ans,DFS(1,len,1));//第一张牌翻转 for(i = 0; i<len; i++) a[i] = str[i]-48; ans = min(ans,DFS(1,len,0));//第一张牌没有手动翻转 if(ans == inf) printf("NO\n"); else printf("%d\n",ans); } return 0; }
相关文章推荐
- 5 神经网络(PRML)
- Windows8.1 .NET Framework 3.5 离线安装
- 来往来势凶猛
- troubleshooting root.sh problem for oracle 10g/11g
- Java Classpath!
- 做SEO,你必须拥有这些素质
- [LeetCode] Maximal Rectangle
- oracle library cache pin、library cache lock原理分析。
- java的外盒问题!
- ACM——Tutor(水题一枚)
- SHELL有用的命令
- 找出N个数中最小的k个数问题(复杂度O(N*logk))
- hadoop学习笔记一之ubuntu下安装jdk
- ubuntu中update-rc.d使用
- 程序的学习和方案!
- uva-644
- 互联网后台服务的协议设计
- POJ P1703 Find them, Catch them
- Java Concurrent Lock锁
- Samba服务器(四):基础