1. 程式人生 > >Card Game Cheater HDU1528

Card Game Cheater HDU1528

name 數組 cin fine 二分圖 main () return %d

二分圖最大匹配問題

撲克題還是用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; }

Card Game Cheater HDU1528