hdu1528 二分图匹配

本文介绍了一种基于扑克牌数值和花色的匹配算法。通过将特定的字母转换为数值,并根据数值大小及花色的不同来建立匹配关系,该算法能够找出一组扑克牌中可能的最大匹配对数。使用邻接矩阵表示每张牌之间的潜在匹配关系,并借助最大匹配算法求解。

注意字母转换:

A = 14

K = 13

Q = 12

J = 11

T = 10

5个


    #include <iostream>
    #include <string.h>
    #include <cstdio>

    using namespace std;

    const int MAXN = 60;
    int n;
    char temp[MAXN][2];
    char flag[2];
    int c[MAXN][MAXN];

    int match[MAXN];
    bool vis[MAXN];

    int change(char ch)
    {
        if (ch == 'A')
        {
            return 14;
        }
        else if (ch == 'J')
        {
            return 11;
        }
        else if (ch == 'Q')
        {
            return 12;
        }
        else if (ch == 'K')
        {
            return 13;
        }
        else if (ch == 'T')
        {
            return 10;
        }
        else
        {
            return ch - '0';
        }
    }

    bool dfs(int u)
    {
        for (int i = 0; i < n; i++)
        {
            if (!vis[i] && c[u][i])
            {
                vis[i] = true;

                if (match[i] == -1 || dfs(match[i]))
                {
                    match[i] = u;
                    return true;
                }
            }
        }

        return false;
    }

    void solve()
    {
        int ans = 0;

        for (int i = 0; i < n; i++)
        {
            memset(vis, false, sizeof(vis));
            ans += dfs(i);
        }

        cout << ans << endl;
    }

    void input()
    {
        int t;

        cin >> t;

        while (t--)
        {
            cin >> n;

            for (int i = 0; i < n; i++)
            {
                scanf("%s", temp[i]);
            }

            memset(c, 0, sizeof(c));
            memset(match, -1, sizeof(match));

            for (int i = 0; i < n; i++)
            {
                scanf("%s", flag);

                for (int j = 0; j < n; j++)
                {
                    if (change(flag[0]) > change(temp[j][0]))
                    {
                        c[i][j] = 1;
                    }
                    else if (change(flag[0]) == change(temp[j][0]))
                    {
                        if (flag[1] == 'H')
                        {
                            c[i][j] = 1;
                        }
                        else if (flag[1] == 'S' && temp[j][1] != 'H')
                        {
                            c[i][j] = 1;
                        }
                        else if (flag[1] == 'D' && temp[j][1] == 'C')
                        {
                            c[i][j] = 1;
                        }
                    }
                }
            }

            solve();
        }
    }

    int main()
    {
        input();
        return 0;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值