• 翻纸牌游戏


    翻纸牌游戏

    Time Limit : 9000/3000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)
    Total Submission(s) : 6   Accepted Submission(s) : 2

    Font: Times New Roman | Verdana | Georgia

    Font Size:  

    Problem Description

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

    Input

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

    Output

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

    Sample Input

    01
    011
    

    Sample Output

    NO
    1
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define INF 1 << 30;
     4 int a[25],cnt[25];
     5 int len,temp,ans;
     6 int OK()
     7 {
     8     int i;
     9     for(i = 0;i < len;i ++)
    10         if(a[i])
    11             return 0;
    12     return 1;
    13 }
    14 
    15 void dfs(int index)
    16 {
    17     int i;
    18     if(OK())
    19     {
    20         temp = 0;
    21         for(i = 0;i < len;i ++)
    22             if(cnt[i] == 1)
    23                 temp++;
    24         if(temp < ans)
    25             ans = temp;
    26         return ;
    27     }
    28     if(index >= len)
    29         return ;
    30     for(cnt[index] = 0;cnt[index] < 2; )
    31     {
    32         a[index] ^= 1;
    33         if(index > 0)
    34             a[index-1] ^= 1;
    35         if(index < len-1)
    36             a[index+1] ^= 1;
    37         cnt[index]++;
    38         dfs(index+1);
    39     }
    40 }
    41 
    42 int main()
    43 {
    44     int i;
    45     char str[22];
    46     while(~scanf("%s",str))
    47     {
    48         len = strlen(str);
    49         for(i = 0;i < len;i ++)
    50             a[i] = str[i]-'0';
    51         ans = INF;
    52         memset(cnt,0,sizeof(cnt));
    53         dfs(0);
    54         if(ans!= 1<<30)
    55             printf("%d
    ",ans);
    56         else
    57             printf("NO
    ");
    58     }
    59     return 0;
    60 }
  • 相关阅读:
    [LeetCode] Happy Number 快乐数
    imread() not working in OpenCV 2.4.11 Debug mode
    OpenCV 3.0 VS2010 Configuration
    [LeetCode] 22. Generate Parentheses 生成括号
    [LeetCode] 24. Swap Nodes in Pairs 成对交换节点
    [LeetCode] 25. Reverse Nodes in k-Group 每k个一组翻转链表
    [LeetCode] 29. Divide Two Integers 两数相除
    [LeetCode] Bitwise AND of Numbers Range 数字范围位相与
    [LeetCode] 31. Next Permutation 下一个排列
    [LeetCode] 32. Longest Valid Parentheses 最长有效括号
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3338983.html
Copyright © 2020-2023  润新知