题目描述
本题目要求对读入的五张Poker牌进行判断:它是否是一个正常的顺子。 说明:34567890JQKA2wW相信大家知道一二,为简化操作,0代表10,w和W代表小王和大王,大,小王可代替任意的牌哟。编程判断输入的五张牌是否会构成一个顺子(方案多个时,输出较大的,34567和0JQKA分别是最小和最大的顺子)
输入格式
输入用五个字符代表的五张牌,系统确保输入的数据无误,但并不一定是有序排列。
输出格式
输出这五张牌组成的顺子或输出空表示不是顺子,注意大小王可当任意的牌使用,输出的顺子要求是最大的一个,且升序排列(如果有的话)。
行末无换行。
输入样例
在这里给出一组输入。例如:
A0KJw
输出样例
在这里给出相应的输出。例如:
[0JQKA]
注意
此题需要注意的是:无论你是否有值,结果都必须写在[]
内。
解析
本人写复杂了,用纯C可能也有更好的解法,用C++也有更好的写法。
find()
属于是致敬python了。
答案
#include <stdio.h>
int initial(char c) {
switch (c) {
case '0':
return 10;
case 'J':
return 11;
case 'Q':
return 12;
case 'K':
return 13;
case 'A':
return 14;
case '2':
return 15;
case 'w':
return 51;
case 'W':
return 52;
default:
return c - '0';
}
}
int *sort(int *list, int len) {
int temp;
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (list[j] < list[j - 1]) {
temp = list[j];
list[j] = list[j - 1];
list[j - 1] = temp;
}
}
}
return list;
}
int find(int *list, int n, int len) {
for (int i = 0; i < len; i++) {
if (n == list[i]) {
return i;
}
}
return -1;
}
int main() {
int lists[100000], lens = 0, n = 0, isLKing = 0, isHKing = 0, KingNum = 0, Temp = 0, LinkNum = 0;
char c = getchar();
char cardList[] = {'0', 'J', 'Q', 'K', 'A', '2'};
while (c != '\n' && c != EOF) {
int changed = initial(c);
int location = find(lists, n, lens);
if (location == -1) {
lists[lens++] = changed;
} else {
lists[location] = -1;
}
c = getchar();
}
sort(lists, lens);
int i = 0;
for (i = lens - 1; i >= 0; i--) {
if (lists[i] == -1)
break;
if (lists[i] >= 51) {
if (lists[i] == 51)
isLKing = 1;
if (lists[i] == 52)
isHKing = 1;
KingNum++;
continue;
}
if (Temp == 0 || Temp - lists[i] == 1) {
Temp = lists[i];
LinkNum++;
} else if (KingNum > 0 && Temp - lists[i] == 2) {
lists[isLKing == 1 ? find(lists, 51, lens) : find(lists, 52, lens)] = --Temp;
Temp = lists[i];
LinkNum++;
LinkNum++;
KingNum--;
}
if (LinkNum + KingNum == 5)
break;
}
sort(lists, lens);
printf("[");
if (LinkNum + KingNum == 5) {
for (int j = i; j <= i + LinkNum - 1; j++) {
if (lists[j] >= 3 && lists[j] <= 9)
printf("%c", '0' + lists[j]);
else
printf("%c", cardList[lists[j] % 10]);
}
}
printf("]");
}