列表

详情


NC54658. 俏兔子大战傻贼鹰-Hard Version

描述

麻蛇更,麻蛇更,麻蛇不更麻蛇羹,麻蛇更麻蛇也羹。 
傻贼鹰今天到兔子家做客因为傻贼鹰听说兔子家的四川省四川大学是一所双流一大学,还有很多漂亮的俏兔子。你作为四川大学英语最好的最俏的俏兔子,被安排接待傻贼鹰。 傻贼鹰来到四川大学被四川大学ACM集训队的兔子拉着打四川麻将,由于傻贼鹰实在学不会麻将,现在兔子们决定复杂一下简单的规则: 
1、只有条(索)、筒(饼)、万三种牌共108张每种牌36张(一二三四五六七八九各4张),没有花、风牌和箭牌。 
2、必须缺一门可胡且开局确定缺哪一门,即胡牌的时候不能有三种花色的牌。 
3、不允许鸣牌(吃碰杠) 
4、坎牌:三张连续的同种牌如(一万二万三万),三张同样的牌如(一筒一筒一筒) 
5、一对将:两张完全相同的牌如(一条一条) 
胡牌规则: 
1、平胡:四坎牌加一对将 
2、七对子:七对一模一样的牌(缺索:一万一万二万二万一筒一筒三筒三筒五筒五筒六筒六筒九筒九筒) 即使简化了规则,傻贼鹰还是学不会,所以就求你告诉他是不是能胡牌,如果能胡牌你就要用你那专业的英语告诉他Yes,不能胡牌你就要告诉他No

输入描述

输入有多组数据,每组数据第一行是N表示这一局傻贼鹰对你询问了N次。

第二行是一个大写字母(T:表示筒(饼),S:表示索(条)W,表示万)用来表示定缺牌。

接下来N行,每行一个字符串用来表示询问是否能胡的14张牌的信息。

比如:1W1W2W2W1T1T3T3T5T5T6T6T9T9T
表示:一万一万二万二万一筒一筒三筒三筒五筒五筒六筒六筒九筒九筒

输出描述

对于傻贼鹰的每一次询问,如果能胡牌输出Yes,不能胡牌输出No。

示例1

输入:

5
S
1W1W2W2W1T1T3T3T5T5T6T6T9T9T
1W1W2W2W1T1T3T3T5T5T6T6T9S9S
8T9T1W3W4W5T8T2W8T9T5T5T5W6W
1W2W2W1W3W3W3W9S1W1W2W2W3W9S
3W3W3W3W4W5W6W6W6W7W8W9W9W9W
1
T
1W3W1S1S2S1W2W1W3W2S3S3S2W1W 

输出:

Yes
No
Yes
No
Yes
Yes   

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 25ms, 内存消耗: 528K, 提交时间: 2019-11-25 20:24:21

#include<bits/stdc++.h>
using namespace std;
int num[15][15]={0};
int main()
{
	int q;
	while(cin>>q)
	{
		getchar();
		char ch;
		cin>>ch;
		while(q--)
		{
			int flag=1;
			string str;
			cin>>str;
			char op;
			for(int i=0;i<str.size();i+=2)
			{
				if(str[i+1]==ch)
				{
					flag=0;break;
				}
				else if(str[i+1]=='T') op=1;
				else if(str[i+1]=='S') op=2;
				else op=3;
				num[str[i]-'0'][op]++;
			}
			int sum1=0,sum2=0;
			for(int i=1;i<=9;i++)
			{
				for(int j=1;j<=3;j++)
				{
					if(i<=7)
					{
						while(num[i][j]&&num[i+1][j]&&num[i+2][j])
						{
							num[i][j]--;
							num[i+1][j]--;
							num[i+2][j]--;
							sum1++;
						}
					}
					if(num[i][j]==3) sum1++;
					if(num[i][j]==2) sum2++;
					num[i][j]=0;
				}
			}
			if(flag&&(sum1==4&&sum2==1||sum2==7))
				cout<<"Yes\n";
			else cout<<"No\n";
		}
	}
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 4ms, 内存消耗: 352K, 提交时间: 2019-11-17 17:10:50

#include<cstdio>
#include<cstring> 
char op,s[52];
int num[10][5];
int main(){
	int t,lens;
	while(~scanf("%d",&t)){
		getchar();
		scanf("%c",&op);
		while(t--){
			scanf("%s",s);
			lens=strlen(s);
			bool flag=true;
			for(int i=0;i<lens;i+=2){
				int op1=s[i]-'0',op2;
				if(s[i+1]=='S') op2=0;
				else if(s[i+1]=='T') op2=1;
				else op2=2;
				num[op1][op2]++;
				if(s[i+1]==op){
					flag=false;
					break;
				}
			}
			int num1=0,num2=0;
			for(int i=1;i<=9;i++)
				for(int j=0;j<3;j++){
					if(i<=7){
						while(num[i][j]&&num[i+1][j]&&num[i+2][j]){
							num[i][j]--;
							num[i+1][j]--;
							num[i+2][j]--;
							num1++;
						}
					}
					if(num[i][j]>=3) num1++;
					if(num[i][j]==2) num2++;
					num[i][j]=0;
				}
			if(flag&&((num1==4&&num2==1)||num2==7)) printf("Yes\n");
			else printf("No\n");
		}
	}
	return 0;
}

上一题