题目:一个双人卡片游戏,每张卡片上有一个1-52中的不同的某个值,开始时每人分发3张牌,
游戏分三轮,每轮每人出异常牌比大小,大的获胜(顺序大,值小的),三局两胜制,
小王子不会玩游戏(认为是随机出牌),现在小王子发了3张牌,而小公主发了2张牌,
问小公主的第三张牌的最大(值最小)为多少时,小王子一定能赢,否则为-1。
分析:搜索。按递增序枚举小公主的最后一张牌,然后和小王子出牌的全排列比较即可。
说明:注意每个卡片只能用一次。
#include <stdio.h>
#include <stdlib.h>
int order[6][3] = {
0, 1, 2, 0, 2, 1,
1, 0, 2, 1, 2, 0,
2, 0, 1, 2, 1, 0,
};
int used[55];
int f(int P[], int X, int Y)
{
for (int i = 1; i <= 52; ++ i) {
if (!used[i]) {
int min = 3;
for (int t = 0; t < 6; ++ t) {
int count = 0;
if (P[order[t][0]] < X) {
count ++;
}
if (P[order[t][1]] < Y) {
count ++;
}
if (P[order[t][2]] < i) {
count ++;
}
if (min > count) {
min = count;
}
}
if (min >= 2) {
return i;
}
}
}
return -1;
}
int main()
{
int P[3], X, Y;
while (~scanf("%d%d%d%d%d",&P[0],&P[1],&P[2],&X,&Y) && P[0]+P[1]+P[2]+X+Y) {
for (int i = 1; i <= 52; ++ i) {
used[i] = 0;
}
used[P[0]] = 1;
used[P[1]] = 1;
used[P[2]] = 1;
used[X] = 1;
used[Y] = 1;
printf("%d\n",f(P, X, Y));
}
return 0;
}