美文网首页
1201: 翻纸牌游戏TE

1201: 翻纸牌游戏TE

作者: Celia_QAQ | 来源:发表于2019-03-20 09:35 被阅读0次

    Time Limit: 1 SecMemory Limit: 128 MB

    Submit: 137Solved: 41

    [Submit][Status][Web Board]

    Description

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

    Input

    有多个case,每个case输入一行01符号串(长度不超过1000),1表示反面朝上,0表示正面朝上。

    Output

    对于每组case,如果可以翻,输出最少需要翻动的次数,否则输出NO。

    Sample Input

    01

    011

    1111

    Sample Output

    NO

    1

    2

    HINT

    对于第一组测试数据,无论怎样操作,都无法完成.

    对于第二组测试数据,只需反转一次最右面的牌即可

    对于第三组测试数据,需要翻转第一张牌和最后一张牌

    ***请使用scanf("%s",s)输入,使用gets()可能会遇到麻烦

    会TE代码:翻纸牌游戏(dfs回溯) - handsomecui - 博客园

    还是出错代码:hdu 2209 翻纸牌游戏 模拟||bfs - ACM我的梦的博客 - CSDN博客


    TE代码,没有心思查了。。。

    #include <bits/stdc++.h>

    #define Min(x,y)(x<y?x:y)

    using namespace std;

    int len,flot,ans;

    int a[25],cnt[25];

    void turn(int x){

    a[x]=!a[x];

    if(x-1>=0) a[x-1]=!a[x-1];

    if(x+1<len)a[x+1]=!a[x+1];

    }

    bool find(){

    for(int i=0;i<len;i++)

    if(a[i]) return false;

    return true;

    }

    void dfs(int x){

    if(find()){

    flot=1;

    int temp=0;

    for(int i=0;i<len;i++)

    if(cnt[i]==1)

    temp++;

    ans=Min(ans,temp);

    return;

    }

    if(x>=len)return;

    for(cnt[x]=0;cnt[x]<2;){

    turn(x);

    cnt[x]++;

    dfs(x+1);

    }

    }

    int main()

    {

    int m, n;

    char t[20];

    while (~scanf("%s",t)){

    len=strlen(t);

    for(int i=0;i<len;i++)

    a[i]=t[i]-'0';

    ans=0x3f3f3f3f;//

    flot=0;

    memset(cnt,0,sizeof(cnt));

    dfs(0);//深度优先搜索

    if(flot)printf("%d\n",ans);

    else printf("NO\n");

    }

    return 0;

    }

    相关文章

      网友评论

          本文标题:1201: 翻纸牌游戏TE

          本文链接:https://www.haomeiwen.com/subject/avvamqtx.html