hdu 1528 Card Game Cheater ( 二分图匹配 )

时间:2023-12-06 16:27:32

题目:点击打开链接

题意:两个人纸牌游戏,牌大的人得分。牌大:2 < 3 < 4 < 5 < 6 < 7 < 8 < 9 < T < J < Q

< K < A 。值一样看花色, hearts (红心) > spades (黑桃) > diamond (方块) >

clubs (梅花)。问Eve 能得多少分。(每次得1分)

分析:将Eve的每张牌与Adam的所有牌比较,与所有比这张牌小的Adam的牌连边。

然后求最大匹配。

感想:几天前就写了,开始WA以为是对于王没有四种花色的处理应该分开。昨天

           突然发现问题根本不在那,因为这里面根本没说王,是数组开小了。

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std; char t1[15]={'2','3','4','5','6','7','8','9','T','J','Q','K','A'};
int t2[15]={1,2,3,4,5,6,7,8,9,10,11,12,13};
struct node
{
int id;
char cha;
char type;
}card[60];
int n,cnt;
int match[60];
int vis[60];
int g[60][60]; bool judge(int x,int y)
{
if(card[x].type=='H' && card[y].type!='H')
return true;
else if(card[x].type=='S' && (card[y].type=='D'||card[y].type=='C'))
return true;
else if(card[x].type=='D' && card[y].type=='C')
return true;
else return false;
}
bool dfs(int u)
{
for(int i=1;i<=n;i++)
{
if(g[u][i] && !vis[i])
{
vis[i]=true;
if(match[i]==-1 || dfs(match[i]))
{
match[i]=u;
return true;
}
}
}
return false;
}
int main()
{
int T,i,j,k;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
getchar();
memset(card,0,sizeof(card));
memset(match,-1,sizeof(match));
memset(g,0,sizeof(g));
for(j=1;j<=n;j++)
{
card[j].cha=getchar();
for(k=0;k<13;k++)
if(card[j].cha==t1[k])
card[j].id=t2[k];
/*if(card[j].id==13)
{
if(j<=n-1)
getchar();
continue;
}*/
card[j].type=getchar();
if(j<=n-1)
getchar();
}
getchar();
for(j=n+1;j<=2*n;j++)
{
card[j].cha=getchar();
for(k=0;k<13;k++)
if(card[j].cha==t1[k])
card[j].id=t2[k];
/*if(card[j].id==13)
{
if(j<=n-1)
getchar();
continue;
}*/
card[j].type=getchar();
getchar();
for(i=1;i<=n;i++)
{
if(card[j].id>card[i].id)
g[j][i]=true;
else if(card[j].id==card[i].id && judge(j,i))
g[j][i]=true;
}
}
cnt=0;
for(i=n+1;i<=2*n;i++)
{
memset(vis,0,sizeof(vis));
if(dfs(i))
cnt++;
}
printf("%d\n",cnt);
}
return 0;
}