您的位置:首页 > 其它

亚马逊 在线笔试 2014-10-9 比较扑克牌序列

2016-05-14 16:25 274 查看
第一题:巨麻烦的一道题目,大意是比较扑克牌序列,每个序列四张牌

 

规则一:四张牌相同。自然数字大的胜出,比如3,3,3,3 < 6,6,6,6

规则二:四张牌连续。当然序列最大的那个胜出。但是有个小trick,A在这里默认表最大牌,但是如果后接2,3,4,则A表最小牌,为了获得连续序列

比如A,2,3,4 < J,Q,K,A

规则三:有三张相同。以每个序列相同牌较大的胜出。

比如3,3,3,2>2,2,2,A

规则四: 两个对子。当然以对子较大的胜出,最大的对子相同,则以次大的对子较大者胜出。

比如4,4,3,3 > 4,2,4,2

规则五:一个对子。对子较大者胜出,如果对子相同,则比较剩下较大牌,如果还相同,比较次大牌

3,3,7,4 < 3,3,7,5

规则六:如果以上皆不满足,则按照大牌>小牌比较(即从最大牌开始比较,分出高下为止)

 

如果两个序列不属于同一规则,则规则小者胜出。

如果序列一大于序列二,输出1,反之输出-1;如果序列相同,输出0。

如果发现作弊,即两副牌中某张牌数量超过5张,则输出-2。

 

OK,以上是题目描述。这个题目,个人感觉主要是读懂题意,实现起来确实也非常麻烦,但是没啥难点,但是也会搞很久。

主要是几点:

1、解析输入字符串(如果你用C、C++,会比较蛋疼)

2、适配规则逻辑(更像状态机)

3,比较逻辑

好像也没啥是吧,但是本屌丝做了N久才把Case全过。而且代码巨长,200+行,准备吃饭去了,代码稍后奉上。

昨晚有事。现在奉上我水的不忍直视的代码。

#include <iostream>
#include <sstream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int change(char a)
{
switch (a)
{
case 'A':
return 14;
break;
case 'J':
return 11;
break;
case 'Q':
return 12;
break;
case 'K':
return 13;
break;
default:
return 0;
break;
}
}

int istype(int *a)
{
int x = a[0];
int ans = 1;
int hash[15];
memset(hash, 0, sizeof(hash));
for (int i = 0; i < 4; i++)
{
hash[a[i]]++;
}
int eq = 1;
int deq = 0;
for (int i = 1; i < 15; i++)
{
if (hash[i] == 4)
return 1;
if (hash[i] == 3)
return 3;
if (i>1)
{
if (hash[i] == hash[i - 1]&&hash[i]==1)
{
eq++;
}
}

if (eq == 4)
return 2;

if (hash[i] == 2)
deq++;
if (deq == 2)
return 4;

}
if (deq == 1)
return 5;
if (eq == 3 && hash[2] == hash[3] && hash[3] == hash[4] &&hash[2]==1 ){
if (a[3] == 14){
a[3] = 1;
sort(a, a + 4);
return 2;
}
}
return 6;
}

int cmp(int *a, int *b, int kind)
{
if (kind == 3)
{
int h1[15], h2[15];
memset(h1, 0, sizeof(h1));
memset(h2, 0, sizeof(h2));
int c1, c2;
for (int i = 0; i<4; i++)
{
h1[a[i]]++;
if (h1[a[i]] == 3)
c1 = a[i];
}
for (int i = 0; i<4; i++)
{
h2[b[i]]++;
if (h2[a[i]] == 3)
c2 = a[i];
}
if (c1>c2)
return 1;
if (c1<c2)
return -1;

}
if (kind == 4)
{
int h1[15], h2[15];
memset(h1, 0, sizeof(h1));
memset(h2, 0, sizeof(h2));
int c1, c2;
for (int i = 0; i<4; i++)
{
h1[a[i]]++;
if (h1[a[i]] == 2)
c1 = a[i];
}
for (int i = 0; i<4; i++)
{
h2[b[i]]++;
if (h2[a[i]] == 2)
c2 = a[i];
}
if (c1>c2)
return 1;
if (c1<c2)
return -1;
}
for (int i = 3; i >=0; i--)
{
if (a[i] > b[i])
return 1;
else if (a[i] < b[i])
return -1;
}
return 0;
}

int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
string a, b;
int aa[4], bb[4];
int hash[15];
while (cin >> a >> b)
{
int ans = 0;
int idx = 0;
for (int i = 0; i < a.size(); i++)
{
int sum = 0;
if (a[i] >= '2'&&a[i] <= '9')
{
sum = a[i] - '0';
aa[idx++] = sum;
}
else if (a[i] == '1')
{
sum = 10;
aa[idx++] = sum;
i++;
}
else if (a[i] == ',')
{
continue;
}
else{
sum = change(a[i]);
aa[idx++] = sum;
}

}
idx = 0;
for (int i = 0; i < b.size(); i++)
{
int sum = 0;
if (b[i] >= '2'&&b[i] <= '9')
{
sum = b[i] - '0';
bb[idx++] = sum;
}
else if (b[i] == '1')
{
sum = 10;
bb[idx++] = sum;
i++;
}
else if (b[i] == ',')
{
continue;
}
else{
sum = change(b[i]);
bb[idx++] = sum;
}
}

memset(hash, 0, sizeof(hash));
for (int i = 0; i < 4; i++)
{

hash[aa[i]]++;
hash[bb[i]]++;
if (hash[aa[i]] > 4 || hash[bb[i]] > 4)
{
ans = -2;
break;
}

}
if (ans == -2)
{
cout << ans << endl;
continue;
}
std::sort(aa, aa + 4);
std::sort(bb, bb + 4);

int ka = istype(aa);
int kb = istype(bb);

//for (int i = 0; i < 4; i++)
//    cout << aa[i] << " ";
//cout << endl;
//for (int i = 0; i < 4; i++)
//    cout << bb[i] << " ";
//cout << endl;

//cout << ka << " " << kb << endl;
if (ka == kb)
{
ans = cmp(aa, bb,ka);
}
else{
if (ka < kb)
ans = 1;
else
ans = -1;
}
cout << ans << endl;
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: