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\n",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的容错方法,也就是奇偶校验方法。

转载于:https://www.cnblogs.com/zhutianpeng/p/3438973.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值