• 模拟——拱猪积分题解


      题目:拱猪积分

      描述:

    【问题描述】
        拱猪是一种很有趣的扑克牌游戏。 即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。

    1. 我们分别以 S 、 H 、 D 及 C 来代表黑桃,红心,方块及梅花,并以数字 1 至 13 来代表 A 、 2 、 … 、 Q 、 K 等牌点,例如︰ H1 为红心 A , S13 为黑桃 K 。
    2. 牌局结束时,由各玩家持有的有关计分的牌 ( 计分牌 ) 仅有 S12 ( 猪 ) ,所有红心牌, D11 ( 羊 ) 及 C10 ( 加倍 ) 等 16 张牌。其它牌均弃置不计。若未持有这 16 张牌之任一张则以得零分计算。
    3. 若持有 C10 的玩家只有该张牌而没有任何其它牌则得 +50 分,若除了 C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。
    4. 若红心牌不在同一家,则 H1 至 H13 等 13 张牌均以负分计,其数值为 -50 , -2 , -3 , -4 , -5 , -6 , -7 , -8 , -9 , -10 , -20 , -30 , -40 。而且 S12 与 D11 分别以 -100 及 +100 分计算。
    5. 若红心牌 H1 至 H13 均在同一家,有下列情形︰
      • 所有红心牌以 +200 分计算(13张总共+200分)。
      • 若 S12 、 D11 皆在吃下所有红心牌之一家,则此玩家得 +500 分(这15张总共+500分)。
      • 而 C10 还是以前面所述原则计算之。

    例一:若各玩家持有计分牌如下: ( 每行代表一玩家所持有之牌 )

    S12 H3 H5 H13

    D11 H8 H9

    C10 H1 H2 H4 H6 H7

    H10 H11 H12

    则各家之得分依序为: -148 、 +83 、 -138 及 -60 。

    例二:若各玩家持有计分牌如下: ( 第四家未持有任何计分牌 )

    H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13

    S12 C10

    D11

    则各家之得分依序为: +200 、 -200 、 +100 及 0 。

    例三:若有一玩家持有所有 16 张计分牌,则得 +1000 分。其余三家均得零分。

    【输入格式】
         每个输入文件由多组测试数据构成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌总数,而后列出其所持有之所有计分牌,牌数与各计分牌均以一个以上的空格分开。相邻两组测试数据之间不会有空白行,读到四家持牌数都为 0 表示文件结束。

    【输出格式】
         每一行输出一组测试数据对应的结果,依次输出各家所得分数,共四个整数 ( 含正负号, 0 除外 ) ,相邻两个整数之间以一个空格分开,符号和数字间不可以有空格。每组输出间不需要有空白行。

    【输入输出样例】
     
    输入:
    heart.in
    4 S12 H3 H5 H13
    3 D11 H8 H9
    6 C10 H1 H2 H4 H6 H7
    3 H10 H11 H12
    13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
    2 S12 C10
    1 D11
    0
    0
    0
    0
    0
     

    输出:
    heart.out
    -148 +83 -138 -60
    +200 -200 +100 0

    解析:很大很大很大的一个模拟……调试起来真方(e)便(xin)……

    AC代码:

    program zht;
    var
    pai,a,b,c,d:ansistring;
    
    sp:array[0..4,0..20] of longint;
    s,f:array[0..10] of longint;
    i,bh,j:longint;
    
    z:array[0..13] of longint;
    
    procedure panduan;
    begin
    
    if length(pai)=2 then pai:=pai[1]+'0'+pai[2];
    if (pai[1]<>'H') and (pai<>'S12') and (pai<>'D11') and (pai<>'C10') then  exit;
    if pai[1]='H' then sp[bh,(ord(pai[2])-48)*10+ord(pai[3])-48]:=1;
    if pai='S12' then sp[bh,14]:=1;
    if pai='D11' then sp[bh,15]:=1;
    if pai='C10' then sp[bh,16]:=1;
    pai:='';
    end;
    
    
    procedure chuli;
    var
    k,w,g:longint;
    begin
    pai:='';
    bh:=1;
    w:=0;
    k:=0;
    g:=0;
    
    w:=pos(' ',a);
    
    for k:=1 to w-1 do
    s[1]:=s[1]*10+ord(a[k])-48;
    
    while 1<2 do
     begin
     if a='0' then break;
                                       // shou pai shu
      for k:=w+1 to length(a) do
       begin
       if a[k]=' ' then begin panduan; pai:=''; continue; end;
       pai:=pai+a[k];
       end;                                            // shou pai
     panduan; pai:='';
     break;
     end;
    
    pai:='';
    bh:=2;
    w:=pos(' ',b);
    
    for k:=1 to w-1 do
    s[2]:=s[2]*10+ord(b[k])-48;
    
     while 1<2 do
     begin
     if b='0' then begin break; end;
       for k:=w+1 to length(b) do
       begin
       if b[k]=' ' then begin panduan; pai:=''; continue; end;
       pai:=pai+b[k];
       end;
      panduan; pai:='';
     break;
     end;
     pai:='';
     bh:=3;
    
      w:=pos(' ',c);
    
      for k:=1 to w-1 do
      s[3]:=s[3]*10+ord(c[k])-48;
    
     while 1<2 do
     begin
     if c='0' then break;
    
    
      for k:=w+1 to length(c) do
       begin
       if c[k]=' ' then begin panduan; pai:=''; continue; end;
       pai:=pai+c[k];
       end;
     panduan; pai:='';
     break;
     end;
    
     pai:='';
     bh:=4;
    
    w:=pos(' ',d);
    
      for k:=1 to w-1 do
      s[4]:=s[4]*10+ord(d[k])-48;
                                      // shou pai shu
    while 1<2 do
     begin
     if d='0' then break;
    
      for k:=w+1 to length(d) do
       begin
       if d[k]=' ' then begin panduan; pai:=''; continue; end;
       pai:=pai+d[k];
       end;
     panduan; pai:='';
     break;
     end;
    k:=0;
    
    
    
    end;
    
    procedure tepan1(k:longint);
    var
    g:longint;
    begin
    g:=0;
    for g:=1 to 4 do
    if s[g]=16 then begin f[g]:=1000;bh:=1; exit; end;
    end;
    
    procedure tepan2(k:longint);
    var
    g,zs:longint;
    begin
     zs:=0;
     for g:=1 to 13 do
      if sp[k,g]=1 then inc(zs);
    
     if zs=13 then begin
               if (s[k]=15) and (sp[k,16]=0) then begin f[k]:=500; exit; end;
               if (s[k]=15) and (sp[k,16]=1) then begin f[k]:=400; exit; end;
                f[k]:=200;   if sp[k,14]=1 then f[k]:=f[k]-100;
                                           end;
    end;
    
    procedure qiu(k:longint);
    var
    g:longint;
    begin
    
    if f[k]<>0 then exit;
    
    for g:=1 to 13 do
    if sp[k,g]=1 then f[k]:=f[k]+z[g];
    
    if sp[k,14]=1 then f[k]:=f[k]-100;
    if sp[k,15]=1 then f[k]:=f[k]+100;
    if sp[k,16]=1 then if s[k]>1 then f[k]:=f[k]*2 else f[k]:=50;
    
    end;
    
    procedure jisuan;
    var
    k:longint;
    begin
    bh:=0;
    tepan1(k);
    
    if bh=1 then exit;
    
    for k:=1 to 4 do
    begin
    tepan2(k);
    qiu(k);
    end;
    
    end;
    
    procedure print;
    var
    k,g:longint;
    begin
    if f[1]>0 then write('+',f[1],' ') else write(f[1],' ');
    if f[2]>0 then write('+',f[2],' ') else write(f[2],' ');
    if f[3]>0 then write('+',f[3],' ') else write(f[3],' ');
    if f[4]>0 then write('+',f[4],' ') else write(f[4],' ');
    writeln;
    
    {for k:=1 to 4 do
     begin
     for g:=1 to 16 do
     write(sp[k,g],' ');
     writeln;
     end; }
    
    fillchar(f,sizeof(f),0);
    fillchar(s,sizeof(s),0);
    fillchar(sp,sizeof(sp),0);
    pai:='';
    end;
    
    begin
    assign(input,'heart.in');
    assign(output,'heart.out');
    reset(input);
    rewrite(output);
    
    z[1]:=-50; z[2]:=-2; z[3]:=-3; z[4]:=-4; z[5]:=-5; z[6]:=-6; z[7]:=-7; z[8]:=-8;
    z[9]:=-9; z[10]:=-10; z[11]:=-20; z[12]:=-30; z[13]:=-40;
    readln(a);
    readln(b);
    readln(c);
    readln(d);
    
    while a+b+c+d<>'0000' do
     begin
     bh:=0;
     chuli;
     {for i:=1 to 4 do
     begin
     for j:=1 to 16 do
     write(sp[i,j],' ');
     writeln;
     end;}
     jisuan;
     print;
    
     readln(a);
     readln(b);
     readln(c);
     readln(d);
     end;
    close(input);
    close(output);
    end.
    AC代码

    <Marvolo原创,严禁转载>

  • 相关阅读:
    (转载)Rime输入法—鼠须管(Squirrel)词库添加及配置
    (转载)Windows下小狼毫输入法(Rime)的安装与配置(含导入搜狗词库)
    (转载)WinCC 卸载后 Simatic Shell 的删除
    (转载)西门子PLC学习笔记十五-(数据块及数据访问方式)
    (转载)一张表搞清楚西门子S7系列标准DB块与优化DB块
    (转载)Navicat Premium 12.1.16.0安装与激活
    (转载)MySQl数据库-批量添加数据的两种方法
    (转载)用C#实现MySQL建库及建表
    设置MYSQL数据库编码为UTF-8
    [设计模式]工厂方法模式(Factory Method)
  • 原文地址:https://www.cnblogs.com/zhtjtcz/p/5086973.html
Copyright © 2020-2023  润新知