NOIPTGA组T3 Mahjong

题意:不知道怎么说。。。。。。
这里写图片描述
这不跟斗地主一样。。xjb乱搜索,超不喜欢这种题。。。因为我自带技能代码量*1.5

var
    b,a,c,s:array[0..10,0..100]of longint;
    n,i,t,j,k,ans1,l,x,p:longint;
    ans:Array[0..100]of longint;
    ch,ch1:char;
    bz:Array[0..4,0..100]of boolean;
        s1:ansistring;
procedure dg(x,y,sum,num:longint);
var
    i,j,k,l,t:longint;
begin
    if (y>9)then
    begin
        dg(x+1,1,sum,num);
        exit;
    end;
    if (num<>0)then
    begin
        if (s[x,y]div 3+sum+num<4)then exit;
    end
    else
        if (sum+1+(s[x,y]-2)div 3<4)then exit;
    t:=3;
    if (x>3)then
    begin
        if (sum+num<4)then exit;
        t:=0;
        if (num=0)then
        begin
            for i:=1 to 3 do
            begin
                for j:=1 to 9 do
                if (a[i,j]<>0)and(not bz[i,j])then
                begin
                    t:=b[i,j];
                    bz[i,j]:=true;
                    break;
                end;
                if (t<>0)then break;
            end;
        end
        else
        begin
            for i:=1 to 3 do
            begin
                for j:=1 to 9 do
                if (a[i,j]>1)then
                begin
                    if (not bz[i,j])then
                    begin
                        t:=b[i,j];
                        bz[i,j]:=true;
                    end;
                    break;
                end
                else
                if (a[i,j]<>0)and(a[i,j+1]<>0)then
                begin
                    if (not bz[i,j-1])then
                    begin
                        t:=b[i,j-1];
                        bz[i,j-1]:=true;
                    end;
                    if (not bz[i,j+2])then
                    begin
                        t:=t+b[i,j+2];
                        bz[i,j+2]:=true;
                    end;
                                        break;
                    end;
                                if (t<>0)then break;
                end;

            end;
                inc(ans[p],t);
        exit;
        end;
    if (a[x,y]<=2)then dg(x,y+1,sum,num);
    if (0=a[x,y])then exit;
    if (a[x,y]=1)then
    begin
            dec(a[x,y]);
        if (a[x,y+1]<>0)and(0<>a[x,y+2])then
        begin
                dec(a[x,y+1]);
            dec(a[x,y+2]);
            dg(x,y+1,sum+1,num);
            inc(a[x,y+1]);
            inc(a[x,y+2]);
        end;
                inc(a[x,y]);
        end
    else if (a[x,y]=2)then
    begin
            if (num=0)then
        begin
                a[x,y]:=0;
            dg(x,y+1,sum,num+1);
            a[x,y]:=2;
        end;
        t:=1;
        while (a[x,y+1]>=t)and(a[x,y+2]>=t)and(t<3)do
        begin
                dec(a[x,y+1],t);
            dec(a[x,y+2],t);
            dec(a[x,y],t);
            dg(x,y+1,sum+t,num);
            inc(a[x,y+1],t);
            inc(a[x,y+2],t);
            inc(a[x,y],t);
            inc(t);
         end;
                 a[x,y]:=2;
        end
    else
        if (a[x,y]=3)then
    begin
            if (0=num)then
        begin
                a[x,y]:=1;
                dg(x,y+1,sum,num+1);
            a[x,y]:=0;
            if (a[x,y+1]<>0)and(0<>a[x,y+2])then
            begin
                    dec(a[x,y+1]);
                dec(a[x,y+2]);
                dg(x,y+1,sum+1,num+1);
                inc(a[x,y+1]);
                inc(a[x,y+2]);
            end;
                end;
        a[x,y]:=0;
        dg(x,y+1,sum+1,num);
        a[x,y]:=3;
        t:=1;
        while (a[x,y+1]>=t )and( a[x,y+2]>=t )and( t<4)do
        begin
                dec(a[x,y+1],t);
            dec(a[x,y+2],t);
            dec(a[x,y],t);
            dg(x,y+1,sum+t,num);
            inc(a[x,y+1],t);
            inc(a[x,y+2],t);
            inc(a[x,y],t);
            inc(t);
        end;
        end
    else
    begin
            if (0=num)then
        begin
                a[x,y]:=2;
            dg(x,y+1,sum,num+1);
            t:=1;
            while (a[x,y+1]>=t)and(a[x,y+2]>=t)and(t<3)do
            begin
                    dec(a[x,y+1],t);
                dec(a[x,y+2],t);
                dec(a[x,y],t);
                dg(x,y+1,sum+t,num+1);
                inc(a[x,y+1],t);
                inc(a[x,y+2],t);
                inc(a[x,y],t);
                inc(t);
            end;
                end;
        a[x,y]:=1;
        dg(x,y+1,sum+1,num);
        a[x,y]:=0;
        if (a[x,y+1]<>0)and(0<>a[x,y+2])then
        begin
                dec(a[x,y+1]);
            dec(a[x,y+2]);
            dg(x,y+1,sum+2,num);
            inc(a[x,y+1]);
            inc(a[x,y+2]);
        end;
        a[x,y]:=4;
        t:=1;
        while (a[x,y+1]>=t)and(a[x,y+2]>=t)and(t<5)do
        begin
                    dec(a[x,y+1],t);
                dec(a[x,y+2],t);
                dec(a[x,y],t);
                dg(x,y+1,sum+t,num+1);
                inc(a[x,y+1],t);
                inc(a[x,y+2],t);
                inc(a[x,y],t);
                inc(t);
        end;
    end;

end;
begin
    {assign(input,'Mahjong.in');
    assign(output,'Mahjong.out');
    reset(input);
    rewrite(output);}
    n:=14;
        i:=0;
        readln(s1);
        j:=1;
        while j<=length(s1) do
    begin
                x:=ord(s1[j])-48;
                ch:=s1[j+1];
                inc(i);
        if (ch='w')then k:=1
        else if (ch='p')then k:=2
        else k:=3;
        inc(a[k,x]);
        if (a[k,x]=1)then c[k,x]:=i;
                inc(j,3);
    end;
    for i:=1 to 3 do
    for j:=1 to 9 do
    b[i,j]:=4-a[i,j];
    for i:=3 downto 1 do
    begin
        s[i,9]:=s[i+1,1]+a[i,9];
        for j:=8 downto 1 do
        s[i,j]:=s[i,j+1]+a[i,j];
    end;
    for i:=1 to 3 do
    for j:=1 to 9 do
    begin
            if (0=a[i,j])then continue;
            fillchar(bz,sizeof(bz),0);
            p:=c[i,j];
            inc(b[i,j]);
            dec(a[i,j]);
            dg(1,1,0,0);
            if (ans[p]>ans[ans1])or(ans[p]=ans[ans1])and(p<ans1)then ans1:=p;
            inc(a[i,j]);
            dec(b[i,j]);
    end;
    writeln(ans1,' ',ans[ans1]);
end.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值