hdu 2209 翻纸牌游戏

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2209

这个题难度还可以

我的思路:有n张牌成第一张牌开始如果是1,则第一张第二张第三张翻转,再看第二张,判断如果是1则第二张第三张第四张翻转,以此下去

不这样还不可以,还得分两种情况如001 按这种思路是不可以的所以还有一种情况不管如何先翻转第一和第二张牌再如上一种思路。

我的AC代码

第一种写法:直接法

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int a[30];
char str[30];

int main(void)
{
int i,ans;
int f1,f2;
while(scanf("%s",str)==1)
{
int len=strlen(str);
int k1,k2;
f1=0; f2=0;
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
a[0]=!a[0];
a[1]=!a[1];
k1=1;
for(i=1;i<len;i++)
{
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k1++;
}
}
if(a[len-1]==0)
f1=1;
k2=0;
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
for(i=1;i<len;i++)
{
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k2++;
}
}
if(a[len-1]==0)
f2=1;
if(f1&&f2)
{
if(k1>k2)
printf("%d\n",k2);
else
printf("%d\n",k1);
}
else if(f1)
printf("%d\n",k1);
else if(f2)
printf("%d\n",k2);
else
printf("NO\n");
}
return 0;
}

第二种写法:递归

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

int a[30];
char str[30];
const int inf=1<<30;

int main(void)
{
int dfs(int i,int len,int k);
int i;
while(scanf("%s",str)==1)
{
int ans=inf;
int len=strlen(str);
for(i=0;i<len;i++)
a[i]=str[i]-‘0‘;
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]-‘0‘;
ans=min(ans,dfs(1,len,0));
if(ans==inf)
printf("NO\n");
else
printf("%d\n",ans);
}
return 0;
}

int dfs(int i,int len,int k)
{
if(i==len)
{
if(a[i-1])
return inf;
else
return k;
}
if(a[i-1])
{
a[i-1]=!a[i-1];
a[i]=!a[i];
a[i+1]=!a[i+1];
k++;
}
dfs(i+1,len,k);
}

hdu 2209 翻纸牌游戏

时间: 2024-09-30 00:37:51

hdu 2209 翻纸牌游戏的相关文章

HDU 2209 翻纸牌游戏(dfs)

翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2180    Accepted Submission(s): 787 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张

HDU 2209 翻纸牌游戏(DFS)

题目链接 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作. Input 有多个case,每个case输入一行01符号串(长度不超过2

【HDOJ】2209 翻纸牌游戏

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

hdu2209翻纸牌游戏(bfs+状态压缩)

Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻到反,或者有反翻到正)时,他左右两张纸牌(最左边和最右边的纸牌,只会影响附近一张)也必须跟着翻动,现在给你一个乱的状态,问你能否把他们整理好,使得每张纸牌都正面朝上,如果可以,最少需要多少次操作. Input 有多个case,每个case输入一行01符号串(长度不超过20),1表

翻纸牌游戏(dfs回溯)

翻纸牌游戏 Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 2   Accepted Submission(s) : 2 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一张纸牌(由正翻

HDU2209 ( 翻纸牌游戏 )

思路:枚举然后深搜,时间复杂度有点高. 代码: 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int a[25]; 7 char c[25]; 8 int flag; 9 int len; 10 int judge() 11 { 12 int i,j; 13 int cnt=0; 14 for

HDU2209 翻纸牌游戏【技巧】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2209 题目大意: 有N张牌,有正面朝上的,也有反面朝上的,现在需要把所有牌都正面朝上,已知每翻一张纸牌, 该纸牌左右两侧各一张纸牌也跟着翻动.现在给你一行只包含字符'0'和'1'的01字符串,'1'代表纸牌 反面,'0'代表纸牌正面.现在需要将字符串变为全为"0000-00"的字符串,一次操作只能改变一个 字符本身和它左右两侧各一个字符,问:最少要经过多少次操作,才能使字符串变为&quo

HDOj-2209-翻纸牌游戏-DFS

翻纸牌游戏 Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2622    Accepted Submission(s): 943 Problem Description 有一种纸牌游戏,很有意思,给你N张纸牌,一字排开,纸牌有正反两面,开始的纸牌可能是一种乱的状态(有些朝正,有些朝反),现在你需要整理这些纸牌.但是麻烦的是,每当你翻一

HDU 3537 Mock Turtles型翻硬币游戏

题目大意: 每次可以翻1个或者2个或者3个硬币,但要保证最右边的那个硬币是正面的,直到不能操作为输,这题目还有说因为主人公感情混乱可能描述不清会有重复的硬币说出,所以要去重 这是一个Mock Turtles型翻硬币游戏 下面是对这个类型游戏的讲解 约束条件6:每次可以翻动一个.二个或三个硬币.(Mock Turtles游戏) 初始编号从0开始. 当N==1时,硬币为:正,先手必胜,所以sg[0]=1. 当N==2时,硬币为:反正,先手必赢,先手操作后可能为:反反或正反,方案数为2,所以sg[1]