问题描述
C语言项目课设、小 游 戏 源 码 免 费 下 载 链 接 如 下:
亚当和夏娃用一副52张的普通牌玩纸牌游戏。规则很简单,两人面对面坐在桌子的两侧。每人从牌堆中取出k张牌,看了之后,将牌面朝下放在桌子上。亚当的牌从左边的1到k编号,夏娃的牌从右边的1到k编号(所以夏娃的第i张牌与亚当的第i张牌相对)。卡片正面朝上,积分如下:
如果亚当的第i(i∈ {1,…,k})张牌胜过夏娃的第i张牌,那么亚当得1分。
如果夏娃的第i张牌胜过亚当的第i张牌,那么夏娃得一分。
点数较高的牌总是胜过点数较低的牌:3胜2、4胜3、…。1张A牌胜过每1张牌,除了(可能)另1张A牌。
如果两张牌的点数相同,那么牌的花色就决定了谁赢:红桃胜过所有其他牌,黑桃胜过除红桃以外的所有花色,方块只胜过梅花,梅花不胜过任何一种花色。
例如,红桃10胜过黑桃10,黑桃10胜过方块10,方块10胜过梅花10。
这应该是一场机会游戏,但最近夏娃大部分时间都赢了,原因是她已经开始使用有标记的牌。换言之,她在亚当把牌翻过来之前就知道他桌上有哪些牌。利用这些信息,她可以先排好自己的牌,以便获得尽可能多的积分。
你的任务是,根据亚当和夏娃的牌,确定夏娃如果打得最好会得到多少分。
输入
输入包括多组测试用例。第一行输入将包含一个正整数N,给出测试用例的数量。
每个测试用例从一行开始,该行带有一个正整数k<=26,这是每个玩家获得的牌数。
下一行描述了亚当放在桌子上的k张牌,从左到右。
再下一行描述了夏娃的k张牌(但她还没有把它们放在桌子上)。卡片由两个字符描述,第一个是它的点数(2、3、4、5、6、7、8、9、T、J、Q、K或A),第二个是它的花色(C、D、S或H,分别表示梅花、方块、黑桃或红桃)。牌之间用空格隔开。因此,如果亚当的牌是梅花10,红桃2和方块J,那可以描述为 TC 2H JD。
输出
对于每个测试用例,如果夏娃选择了最佳的方式将卡片排列在桌子上,输出其最多得分。
输入样例
3
1
JD
JH
2
5D TC
4C 5H
3
2H 3H 4H
2D 3D 4D
输出样例
1
1
2
(1)编程思路。
由于需要对扑克牌进行排序,而采用牌面字符串不方便进行排序,因此可以编写函数int getVal(char card[5])将52张扑克牌中的某张由card字符串指定的牌面转换为对应的整数值(8~59之一)。转换时,牌面2C=8、2D=9、2S=10、2H=11、…、AC=56、AD=57、AS=58、AH=59。
扑克牌的一张牌面包含点数和花色两个信息,可以将点数2~9分别取2~9,T、J、Q、K分别取10、11、12、13,A取14,四种花色C、D、S、H分别取0、1、2、3,这样每张牌按牌面可映射为一个整数值,映射公式为: 牌面值=点数*4+花色。
这样,对扑克牌的排序就可以转换为对整数的排序。
输入亚当和夏娃各自所取的K张牌后,将每张牌按牌面转换为一个整数值并分别保存到数组A和数组E中,然后将数组A和E分别按从小到大的顺序排列好。
为了求出夏娃的最多得分,可以采用贪心法求解。
贪心策略是:如果夏娃当前最大的牌可以赢亚当最大的牌,那么让这两张牌比大小,赢得1分;如果夏娃当前最小的牌能赢亚当最小的牌,那么让这两牌比大小,赢得1分;如果上面两个条件都不满足,就让夏娃当前最小的牌和亚当当前最大的牌比大小,让亚当得1分,但用掉其最大的牌。
(2)源程序。
#include <stdio.h>
void sort(int a[],int n)
{
int i,j,tmp;
for (i=0;i<n-1;i++)
for (j=0;j<n-1-i;j++)
if (a[j]>a[j+1])
{
tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp;
}
}
int value(char card[])
{
int p,s;
if (card[0]>='2' && card[0]<='9')
p=card[0]-'0';
else if (card[0]=='T') p=10;
else if (card[0]=='J') p=11;
else if (card[0]=='Q') p=12;
else if (card[0]=='K') p=13;
else if (card[0]=='A') p=14;
if (card[1]=='C') s=0;
else if (card[1]=='D') s=1;
else if (card[1]=='S') s=2;
else if (card[1]=='H') s=3;
return 4*p+s;
}
int main()
{
int n;
scanf("%d",&n);
while (n--)
{
int a[27],e[27];
int k;
scanf("%d",&k);
char card[3];
int i;
for (i=0;i<k;i++)
{
scanf("%s",card);
a[i]=value(card);
}
for (i=0;i<k;i++)
{
scanf("%s",card);
e[i]=value(card);
}
sort(a,k);
sort(e,k);
int cnt=0;
int aBegin=0,aEnd=k-1;
int eBegin=0,eEnd=k-1;
while (eBegin<=eEnd)
{
if (e[eBegin]>a[aBegin])
{
aBegin++; eBegin++; cnt++;
}
else if (e[eEnd]>a[aEnd])
{
aEnd--; eEnd--; cnt++;
}
else
{
eBegin++; aEnd--;
}
}
printf("%d\n",cnt);
}
return 0;
}