Card Game Cheater HDU1528

二分图最大匹配问题 

扑克题还是用map比较方便 

#include<bits/stdc++.h>
using namespace std;
#define MAXI 52
int yd[MAXI][2];
int xw[MAXI][2];
int used[MAXI];
int vis[MAXI];
int n,m;

map<char,int>mm;

bool judge(int a,int b)
{
   if( mm[xw[a][0]]>mm[ yd[b][0] ] )
    return true;
   else if(mm[xw[a][0]]==mm[ yd[b][0] ])
    return mm[xw[a][1]]>mm[ yd[b][1] ];
   else
    return false;
}

bool dfs(int  x)//x指夏娃数组下标
{
    for(int j=1;j<=n;j++)//j是亚当的
    {
        if(judge(x,j)&&!used[j])
        {
            used[j]=1;
            if(!vis[j]||dfs(vis[j]) )
              {
                  vis[j]=x;
                  return true;
              }
        }
    }
    return false;
}

int find1(void)
{    int ans=0;
     memset(vis,0,sizeof(vis));
     for(int i=1;i<=n;i++)//这里的i指的是夏娃的
       {
           memset(used,0,sizeof(used));
           if(dfs(i))ans++;
       }
       return ans;
}

int main()
{
  int cas;
  cin>>cas;
  for(char i='2';i<='9';i++)
      mm[i]=i-'0';
  mm['T']=10;
  mm['J']=11;
  mm['Q']=12;
  mm['K']=13;
  mm['A']=14;
  mm['C']=1;
  mm['D']=2;
  mm['S']=3;
  mm['H']=4;
  int first=1;
  while(cas--)
  {
     scanf("%d",&n);
     char s[5];
     for(int i=1;i<=n;i++)
     {
         scanf("%s",s);
         yd[i][0]=s[0];
         yd[i][1]=s[1];
     }
      for(int i=1;i<=n;i++)
      {
          scanf("%s",s);
          xw[i][0]=s[0];
          xw[i][1]=s[1];
      }
      printf("%d\n",find1());
  }
  return 0;
}

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10364756.html