POJ 2005 Blackjack(水题,考验耐心。极易出错)

来源:互联网 发布:mac视频播放器 mpv 编辑:程序博客网 时间:2024/06/04 19:34

题意:21点游戏,玩家和庄家各从牌堆中抽两张牌。分别有A,2,3,4,5,6,7,8,9,T,J,Q,K这几种牌。T,J,Q,K对应的数值都是10,A对应的数值可能是11或者1,但是只有当两张牌同时为A的情况下,其中的一个才能为1.

输入,牌堆个数deck,然后依次输入三个数,分别为庄家明牌,玩家的两张牌。玩家根据庄家的明牌计算自己胜利的概率。

 

分析:一定要特别注意两张牌都为A的情况,和为12.要注意一下。

用一个长度大于或等于14的数组,存储一下,每张牌对应出现的情况,方便之后在计算总数时减去。

 

贴一下代码:(240k,47ms)

 

C++语言:
#include<iostream>
using namespace std;
int score(char ch)     //将输入的字符转换成整型
{
    if(ch=='A')
       return 11;
    else if(ch =='T' || ch=='J'||ch=='Q'||ch=='K')
       return 10;
    else
       return ch-'0';
}

intmain()
{
   int deck,i;
   char card[3];  //存储输入数据
   int a[3];
   int sum,player,dealer;
    //sum为玩家能赢的所有情况,player为玩家手牌的点数
     while(cin>>deck,deck)
   {
      int count[14]={0};    //用于存储对应位置的牌出现的次数
      memset(a,0,3);
      double left=deck*52-3;
      sum player= dealer = 0;       
      for(i=0 ;i3;i++)
      {
         cin>>card[i];
         a[i]=score(card[i]);
         count[a[i]]++;
      }
      player a[1]+a[2];
      if(player ==22 )       //当玩家的两个牌都是A的时候,相加是等于11+1的。
         player=12;
      dealer=a[0];
      for(i=2 ;i<=11 ;i  ++)
      {
         if( ( (dealer+i==22)?12:dealer+i<player)  
             //判断dealer +i的值是否等于22,如果是相当于就是两个A,所以取值为12.如果庄家手牌和小于玩家,玩家赢
         {
             if(i==10)sum+=deck*4*4- count[i];    //四个10。
             else sum+=deck*4-count[i];   //如果出现过,就要减去
         }
      }
      printf("%0.3f%%\n\n",(double)sum*100/left);
   }
}
原创粉丝点击