幻想乡扑克游戏
解法一
我们可以使用一个桶 b[],将牌全部存入桶中。这样,当 b[i]>=4 即可表明有炸弹,而当 b['D']>0 && b['X']>0 就说明有大小王存在。这样即可通过本题。注意开桶的做法要多测清空,否则罚时两行泪。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int T,b[128];
cin >> T;
while (T--)
{
memset(b,0,sizeof(b));//多测清空
bool flag=false;
string s;
cin >> s;
for (int i=0;i<s.length();i++)//将牌放入桶中
b[s[i]]++;
if (b['X']>0 && b['D']>0)//判断是否存在大小王
flag=true;
for (int i=1;i<=127 && !flag;i++)//判断是否存在炸弹
{
if (b[i]>=4)
flag=true;
}
puts(flag?"Yes":"No");
}
return 0;
}
解法二
实际上,由于牌已经保证了被理好,因而我们可以直接扫一遍牌。对于字符串 s,只要有 s[i]==s[i+1] && s[i+1]==s[i+2] && s[i+2]==s[i+3],即可说明存在炸弹。由于只有一副牌,因此只要判断 s[0] 与 s[1] 是否是王即可。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
int T;
cin >> T;
while (T--)
{
bool flag=false;
string s;
cin >> s;
if (s[0]=='D' && s[1]=='X')//判断大小王
flag=true;
for (int i=0;i<s.length()-3 && !flag;i++)//扫描一遍牌,看是否存在炸弹
{
if (s[i]==s[i+1] && s[i+1]==s[i+2] && s[i+2]==s[i+3])
flag=true;
}
puts(flag?"Yes":"No");
}
return 0;
}