• UVA 131 The Psychic Poker Player


    UVA_131

           这个题目的难度不是很大,只要能够细心的枚举每种情况即可。

           在枚举的时候,首先用子集生成的位运算算法确定最后手里的牌,然后再把需要添加的牌加入,之后就是依次考虑每种情况了。

    #include<stdio.h>
    #include
    <string.h>
    char *b="A23456789TJQK";
    char *c="CDHS";
    char ans[][20]={"straight-flush","four-of-a-kind","full-house","flush",
    "straight","three-of-a-kind","two-pairs","one-pair","highest-card"};
    char a[15][5];
    int face[15],suit[15][5];
    int search()
    {
    int i,j,k,f,n,first;

    for(first=0;!face[first];first++);

    for(i=first;i<13;i++)
    if(face[i])
    {
    for(j=i,n=0;j<13&&face[j];j++)
    n
    ++;
    if(n==5||(n==4&&j==13&&face[0]))
    {
    for(k=0;k<4;k++)
    if(suit[first][k])
    break;
    for(f=first+1;f<13;f++)
    if(face[f]&&suit[f][k]!=suit[first][k])
    break;
    if(f==13)
    return 0;
    }
    }

    for(i=first;i<13;i++)
    if(face[i]==4)
    return 1;

    for(i=first;i<13;i++)
    if(face[i]==3)
    {
    for(j=first;j<13;j++)
    if(face[j]==2)
    return 2;
    break;
    }

    for(k=0;k<4;k++)
    {
    for(i=first;i<13;i++)
    if(face[i]>1||(face[i]&&!suit[i][k]))
    break;
    if(i==13)
    return 3;
    }

    for(i=first;i<13;i++)
    if(face[i])
    {
    for(n=0,j=i;j<13&&face[j];j++)
    n
    ++;
    if(n==5||(n==4&&j==13&&face[0]))
    return 4;
    }

    for(i=first;i<13;i++)
    if(face[i]==3)
    return 5;

    for(i=first;i<13;i++)
    if(face[i]==2)
    for(j=i+1;j<13;j++)
    if(face[j]==2)
    return 6;


    for(i=first;i<13;i++)
    if(face[i]==2)
    return 7;

    return 8;
    }
    int main()
    {
    int i,j,k,f,n,num,min;
    while(scanf("%s",a[0])!=EOF)
    {
    for(i=1;i<10;i++)
    scanf(
    "%s",a[i]);
    min
    =10;
    for(i=0;i<(1<<5);i++)
    {
    memset(face,
    0,sizeof(face));
    memset(suit,
    0,sizeof(suit));
    num
    =0;
    for(j=0;j<5;j++)
    if(i&(1<<j))
    {
    num
    ++;
    f
    =strchr(b,a[j][0])-b;
    face[f]
    ++;
    k
    =strchr(c,a[j][1])-c;
    suit[f][k]
    ++;
    }
    for(j=5;j<10-num;j++)
    {
    f
    =strchr(b,a[j][0])-b;
    face[f]
    ++;
    k
    =strchr(c,a[j][1])-c;
    suit[f][k]
    ++;
    }
    n
    =search();
    if(n<min)
    min
    =n;
    }
    printf(
    "Hand: ");
    for(i=0;i<5;i++)
    printf(
    "%s ",a[i]);
    printf(
    "Deck: ");
    for(;i<10;i++)
    printf(
    "%s ",a[i]);
    printf(
    "Best hand: ");
    printf(
    "%s\n",ans[min]);
    }
    return 0;
    }

      

  • 相关阅读:
    (73)C# 扩展方法
    网络
    (十九)守护进程
    (十二)函数返回局部变量
    (十八)WireShark 过滤语法
    (十七)linux网络命令 vconfig ifconfig
    (十六)getsockname()
    (十五)ioctl、ifreq、ifconf
    (十四)UDP协议的两个主要方法sendto和recvfrom详解
    (十三)Packet socket 和 sockaddr_ll
  • 原文地址:https://www.cnblogs.com/staginner/p/2164319.html
Copyright © 2020-2023  润新知