题目:拱猪积分
描述:
【问题描述】
拱猪是一种很有趣的扑克牌游戏。 即使你不知道它的玩法,你也可以由它的计分方式来了解它的趣味性。 假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的计分规则,在牌局结束时计算四位玩家所得分数。
- 我们分别以 S 、 H 、 D 及 C 来代表黑桃,红心,方块及梅花,并以数字 1 至 13 来代表 A 、 2 、 … 、 Q 、 K 等牌点,例如︰ H1 为红心 A , S13 为黑桃 K 。
- 牌局结束时,由各玩家持有的有关计分的牌 ( 计分牌 ) 仅有 S12 ( 猪 ) ,所有红心牌, D11 ( 羊 ) 及 C10 ( 加倍 ) 等 16 张牌。其它牌均弃置不计。若未持有这 16 张牌之任一张则以得零分计算。
- 若持有 C10 的玩家只有该张牌而没有任何其它牌则得 +50 分,若除了 C10 还有其它计分牌,则将其它计分牌所得分数加倍计算。
- 若红心牌不在同一家,则 H1 至 H13 等 13 张牌均以负分计,其数值为 -50 , -2 , -3 , -4 , -5 , -6 , -7 , -8 , -9 , -10 , -20 , -30 , -40 。而且 S12 与 D11 分别以 -100 及 +100 分计算。
-
若红心牌 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.
<Marvolo原创,严禁转载>