模拟——拱猪积分题解

  题目:拱猪积分

  描述:

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

  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原创,严禁转载>

原文地址:https://www.cnblogs.com/zhtjtcz/p/5086973.html