c++ 超级麻将问题

来源:百度知道 编辑:UC知道 时间:2024/05/08 23:16:13
第二题 超级麻将(文件名: Mahjong)
时限:1s 分值:100
试题描述
很多人都知道玩麻将,当然也有人不知道,呵呵,不要紧,我在这里简要地介绍一下麻将规则:
普通麻将有砣、索、万三种类型的牌,每种牌有1~9个数字,其中相同的牌每个有四张,例如1砣~9砣,1索~9索,1万~9万各有4张,所以共36*3=108张牌。胡牌时每人有14张牌,其中只要某人手里有若干句话(就是同种类型的牌连续三张或同种牌三张),另外再加上一对,即可胡牌。当然如果全是对,叫七小对,也可以胡牌。下图是连三张示例。

要判断某人是否胡牌,显然一个弱智的算法就行了,某中学信息学小组超级麻将迷想了想,决定将普通麻将改造成超级麻将。
所谓超级麻将没有了砣、索、万的区分,每种牌上的数字可以是1~100,而每种数字的牌各有100张。另外特别自由的是,玩牌的人手里想拿多少张牌都可以,好刺激哦!
刺激归刺激,但是拿多了怎么胡牌呢?
超级麻将规定只要一个人手里拿的牌是若干句话(三个连续数字的牌各一张组成一句话,三张或者四张同样数字的牌也算一句话),再加上一对相同的牌,就算胡了。
作为信息学竞赛选手的你,麻烦你给这位超级麻将迷编个程序,判断能否胡牌。

输入
输入文件第一行一个整数N(N<=100),表示玩了N次超级麻将。
接下来N行,每行100个数a1..a100,描述每次玩牌手中各种牌的数量。ai表示数字为i的牌有ai张。(0<=ai<=100)

输出
输出N行,若胡了则输出Yes,否则输出No,注意区分Yes,No的大小写!

样例
Mahjong.in
3
2 4 0 0 0 0 0 …… 0(一共98个0)
2 4 2 0 0 0 0 …… 0(一共97个0)
2 3 2 0 0 0 0 …… 0(一共97个0)
Mahjong.out
Yes
Yes
No
急用
在线等
OK的话再加悬赏50分!!!!!

太长了……
将近上千条语句……

..................................
太长了!~~~~~````

你大侠用什么写啊上千语句???/

不清楚

#include<cstdio>#include<algorithm>#include<cstring> using namespace std;const int maxn=110;bool f[maxn][maxn][maxn],g[maxn][maxn][maxn];int a[maxn];int main(){    int T;    scanf("%d",&T);    while(T--){        memset(f,false,sizeof(f));        memset(g,false,sizeof(f));
       For(i,1,100) scanf("%d",&a[i]);
       g[0][0][0]=true;
       For(i,1,100)
           For(j,0,a[i-1])
               For(k,0,a[i]){                    if(k>=2) f[i][j][k]|=g[i][j][k-2];                    if(k>=