HDU 2209 翻纸牌游戏

来源:互联网 发布:淘宝 情趣内衣 买家秀 编辑:程序博客网 时间:2024/05/22 22:43

传送门

分析:从最终结果出发不管最终纸牌翻转成什么样,第一张纸牌只有两种情况:1.翻转过,2:未翻转过
而影响第一张纸牌的只有本身和第二张纸牌,
所以分两种情况:1:第一张纸牌本身翻转,然后搜索第2,3,4,….n张并由第i-1张纸牌是否正面朝上而决定第i张是否翻转(第i-1张纸牌前的纸牌已全部正面朝上),最后只需要判断第n张纸牌是否正面朝上即可
2:第一张纸牌本身不翻转,然后过程和第1种情况一样

注意记录两个数组来模拟,不然模拟一次后,就不是原来的数组了。

#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;#define LL long long#define INF 0x3f3f3f3fconst int MAXN=25;char s[MAXN];int p[MAXN],h[MAXN];int len;int main(){    while(~scanf("%s",s)){        len=strlen(s);        for(int i=0;i<len;i++){            h[i]=p[i]=s[i]-'0';        }        int ans=INF;        int sum=0;        for(int i=1;i<len;i++){            if(p[i-1]){                sum++;                p[i-1]=!p[i-1];                p[i]=!p[i];                p[i+1]=!p[i+1];            }        }        if(p[len-1])sum=INF;        ans=min(sum,ans);        sum=1;        h[0]=!h[0];        h[1]=!h[1];        for(int i=1;i<len;i++){            if(h[i-1]){                sum++;                h[i-1]=!h[i-1];                h[i]=!h[i];                h[i+1]=!h[i+1];            }        }        if(h[len-1])sum=INF;        ans=min(sum,ans);        if(ans==INF)printf("NO\n");        else printf("%d\n",ans);        }    return 0;}
0 0
原创粉丝点击