题目链接

Problem Description
有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌。但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作。
 
Input
有多个case,每个case输入一行01符号串(长度不超过20),1表示反面朝上,0表示正面朝上。
 
Output
对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。
 
Sample Input
01
011
 
Sample Output
NO
1
题解:这个思路来自于xyyh,代码很短,但是刚开始不好理解。思路是这样的:
首先有两个分支,即第一张牌翻还是不翻(它的前面没有牌,所以两种可能都要考虑),之后往后dfs,在dfs函数中讨论某张牌翻不翻,就去看这张牌的前面一张牌是正面还是反面,如果是正面,那就不翻现在这张牌,否则,翻这张牌来把前面那张变成正面,变成正面后,没有其他操作会将它变回反面了,这样下去,当搜索结束之后,讨论最后一张牌,如果是正,那就这组可以翻,否则,只有这一张是反面的,没办法进行下一步动作了。
#include <cstdio>
#include <iostream>
#include <string>
#include <sstream>
#include <cstring>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#define PI 3.1415926
#define ms(a) memset(a,0,sizeof(a))
#define msp memset(mp,0,sizeof(mp))
#define msv memset(vis,0,sizeof(vis))
using namespace std;
//#define LOCAL
int a[];
int ans;
int dfs(int i,int len,int cnt)
{
if(i==len)
{
if(a[len-])return 1e9;
else return cnt;
}
if(a[i-])a[i-]=,a[i]=!a[i],a[i+]=!a[i+],cnt++;
return dfs(i+,len,cnt);
}
int main()
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
#endif // LOCAL
ios::sync_with_stdio(false);
char t[];
while(cin>>t)
{
int len=strlen(t);
for(int i=;i<len; i++)a[i]=t[i]-'';
a[]=!a[],a[]=!a[];
int ans=1e9;
ans=min(dfs(,len,),ans);
for(int i=,len=strlen(t);i<len; i++)a[i]=t[i]-'';
ans=min(dfs(,len,),ans);
if(ans==1e9)printf("NO\n");
else printf("%d\n",ans);
}
return ;
}

HDU 2209 翻纸牌游戏(DFS)的更多相关文章

  1. HDU 2209 翻纸牌游戏 状态BFS

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem De ...

  2. HDU 2209 翻纸牌游戏

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  3. hdu 2209 翻纸牌游戏【贪心】

    本来是冲着搜索去的--其实可以贪心 因为能改变第一位的只有第一位和第二位,然后改完之后后面的同理,也就是说只要贪心的推一遍就可以 但是注意要在翻第一个和不翻第一个之间取个min #include< ...

  4. 【HDOJ】2209 翻纸牌游戏

    状态压缩+双向广搜.注意控制时间t. /* 2209 */ #include <iostream> #include <string> #include <map> ...

  5. 翻纸牌游戏(dfs回溯)

    翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submiss ...

  6. hdu2209翻纸牌游戏

    翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  7. HDU 3537 Mock Turtles型翻硬币游戏

    题目大意: 每次可以翻1个或者2个或者3个硬币,但要保证最右边的那个硬币是正面的,直到不能操作为输,这题目还有说因为主人公感情混乱可能描述不清会有重复的硬币说出,所以要去重 这是一个Mock Turt ...

  8. 翻纸牌 高校俱乐部 英雄会 csdn

    题目描述 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者 ...

  9. [Usaco2007 Open]Fliptile 翻格子游戏题解

    问题 B: [Usaco2007 Open]Fliptile 翻格子游戏 时间限制: 5 Sec  内存限制: 128 MB 题目描述 Farmer John knows that an intell ...

随机推荐

  1. Thinkphp5 设置日志

    database.php 'debug' => false, application/config.php 'log' => [ // 日志记录方式,支持 file socket 'typ ...

  2. 在vim编辑器中,删除操作

    我这里在编辑一个很大的文件,有几万行,都是文件名sheetid, 中间有很多空行,我现在要做的事情就有要把这个文件中的空行都删除掉,这个本来想在ultraedit里面完成的,结果弄了好半天都没有搞定, ...

  3. OBJECT-ORIENTED

  4. 关于泛型中<T extends comparable>的理解

    public static <T extends Comparable> T min(List<T> t); 对于上面定义的泛型方法min中,Comparable指的是一个接口 ...

  5. 解析Properties文件

    /** * 传入需要解析的文件属性,传入文件的路径 * @param para 需要获取的属性名称.也就是键值对中的键名称 * @param filepath * @return */ public ...

  6. js判断数组里面的值是否相等。

    var zhi=[]; var zhiT=[]; //var arr=["a","b","a","a"]; var ar ...

  7. nyoj 523 双向广搜

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstd ...

  8. LeetCode 453. Minimum Moves to Equal Array Elements C#

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  9. studio_svn

    最新升级IDEA12到13版本,升级后发现IDEA中SVN无法正常使用,但文件夹下能够正常使用. 并且报错:svn: E204899: Cannot run program "svn&quo ...

  10. SQLServer中的变量:局部变量,全局变量

    SQLServer中的全局变量   变量 Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量.局部变量 局部变量是一个能够拥有特定数据类型的对象 ...