• 53张牌中找出缺少的牌的花色和点数--raid3,4,5,6的容错原理


       一副扑克牌,抽出一张,要求找出抽出的牌的点数和花色。

       算法的主要思想就是用异或运算来确定丢的牌的花色。四种花色分别如下表示:红桃用1(二进制0001)表示,黑桃用2(二进制0010)表示,黑桃用4(0100)表示,方块用8(1000)表示,这样当同一点数的四个花色都齐全的话,则四种花色异或的结果再与15(1111)异或之后,结果为0。如果确实一种花色,则三张存在的牌的花色值异或后与15异或所得的结果为抽出的花色的值。比如说:抽出的花色为红桃,则0010^0100^1000^1111=0001,正好等于红桃的值。具体实现见下面的代码。

    #include <stdio.h>
    #include <map>
    #define NUMS 2   //NUMS = 2 用于演示,如果是一副牌的话NUMS应定义为53 
    using namespace std;
    
    typedef struct Card{
      int num; //num用0-13分别表示A,2,3,4……,10,J,Q,K,王
      int flower; //flower表示花色 1表示红桃,3表示大王,2表示黑桃,12表示小王,3表示梅花,4表示方块
    }Card;
    
    void find(Card cards[])
    {
    int i;
    map<int,int> numclass_Map;
    for(i=0;i<NUMS;i++)numclass_Map[i] = 15;
    
    for(i = 0;i<NUMS*4-1;i++)
    {   numclass_Map[cards[i].num]
    ^=cards[i].flower;   if(numclass_Map[cards[i].num] == 0) numclass_Map.erase(cards[i].num); } map<int,int>::iterator it; it = numclass_Map.begin(); printf("点数:%d 花色:%d ",it->first+1,it->second); } void main()
    {
    //just for test Card cards[NUMS
    *4-1];
    cards[
    0].num = 0; cards[0].flower = 1; cards[1].num = 0; cards[1].flower = 2; cards[2].num = 0; cards[2].flower = 4; cards[3].num = 0; cards[3].flower = 8; cards[4].num = 1; cards[4].flower = 1; cards[5].num = 1; cards[5].flower = 2; cards[6].num = 1; cards[6].flower = 4; //cards[7].num = 1; //cards[7].flower = 8; find( cards); }

    输出:

         点数:2 花色:8

        如果是抽出两种牌,这个算法也是可以分别找出抽出的牌的点数和花色的。这种容错的方法也就是raid3,4,5,6的容错方法,也就是奇偶校验方法。

  • 相关阅读:
    BZOJ-1034: [ZJOI2008]泡泡堂BNB (田忌赛马贪心)
    BZOJ-2190: [SDOI2008]仪仗队 (欧拉函数)
    BZOJ-1864: [Zjoi2006]三色二叉树 (julao都说简单的树形DP)
    BZOJ-2657: [Zjoi2012]旅游(journey) (树形DP求最长链)
    BZOJ-2241: [SDOI2011]打地鼠 (模拟+枚举)
    BZOJ-1207: [HNOI2004]打鼹鼠 (LIS类似DP)
    BZOJ-1821: [JSOI2010]Group 部落划分 Group (二分+并查集)
    BZOJ-1218: [HNOI2003]激光炸弹 (前缀和+模拟)
    [SinGuLaRiTy] ZKW线段树
    [SinGuLaRiTy] 字节大小
  • 原文地址:https://www.cnblogs.com/zhutianpeng/p/3438973.html
Copyright © 2020-2023  润新知