原题链接:https://blog.csdn.net/weixin_43581819/article/details/90405178
时间限制:2s
描述:
Alice沉迷于机器人研究,他打算做一个机器人来检查一副扑克是否完成,现在,他想请你帮他写一个程序,来识别纸牌。每张纸牌都有一个花色(四种花色,分别用大写字母P,K,H,T表示)和一个数字点数(1-13).纸牌可以用ABC的形式来表示,A代表花色,BC代表数字,如果数字小于10,会有一位补0.比如花色是P,数字是9的纸牌会表示成P09.一副完整的纸牌有52张牌,四种不同的花色各有1张数字1-13的牌。
你的程序要读入一个字符串,表示缺少的纸牌有哪些,如果包含相同的纸牌(花色数字都相同)输出GRESKA,否则输入每种花色剩余的纸牌数量。
输入
输入只有一行,一个字符串s,s的长度小于等于1000.
输出
如果输入中包含相同的纸牌,输出GRESKA,否则分别输入四个整数,代表P,K,H,T四种花色纸牌的剩余数量。
样例输入1
P01K02H03H04
样例输出1
12 12 11 13
样例输入2
H02H10P11H02
样例输出2
GRESKA
提示
样例1中P花色缺少P01,所以只有12张,K花色缺少K02,所以也只有12张,H花色缺少两张;T花色不缺牌。
思路
直接模型法搞定:
1 创建牌组
2 3个3个的获取输入字符串
3 将获取到的字符串从牌组中匹配并去除
3.1 如果匹配成功则删除该牌后继续下一个
3.2 如果匹配失败肯定是之前删除过直接【GRESKA】
4 显示各牌组数量
//P,K,H,T
List<string> p_cards = new List<string>() { };
List<string> k_cards = new List<string>() { };
List<string> h_cards = new List<string>() { };
List<string> t_cards = new List<string>() { };
for (int i = 1; i <= 13; i++)// 构建牌组
{
if (i < 10)
{
p_cards.Add("P0" + i);
k_cards.Add("K0" + i);
h_cards.Add("H0" + i);
t_cards.Add("T0" + i);
}
else
{
p_cards.Add("P" + i);
k_cards.Add("K" + i);
h_cards.Add("H" + i);
t_cards.Add("T" + i);
}
}
List<List<string>> cards = new List<List<string>>() { p_cards, k_cards, h_cards, t_cards };
string readLineString = "H02H10P11H02";// 长度及输入验证略
Console.WriteLine(readLineString);
bool isGRESKA = false;
while (true)
{
bool isFind = false;
foreach (List<string> _cards in cards)
{
isFind=_cards.Remove(readLineString.Substring(0, 3));
if (isFind) break;
}
if (!isFind)
{
Console.WriteLine("GRESKA");
isGRESKA = true;
break;
}
if (readLineString.Length > 3)
{
readLineString = readLineString.Substring(3);
}
else break;
}
if (!isGRESKA)
{
foreach (List<string> _cards in cards)
{
Console.Write(_cards.Count + "\t");
}
}
Console.WriteLine();
Console.ReadKey();