摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
MaJiang ★☆☆☆☆ 答案正确 100 2014-10-30 20:30:17


题意

按照规则判断麻将是否为取胜状态。

题解

由于前两个已经确定,其实是降低了难度。

然后由于数据量不大,深度优先搜索各种胜利组合(三个相同,三个连续)。

不算太复杂。

另外考虑到数据量不大,单次查询O(logn)级别基本可以视作O(1),为了偷懒降低代码实现复杂度,直接用map来存储。


代码

1524.cpp代码已折叠
展开折叠内容
#include<string>
#include<map>
#include<iostream>
using namespace std;
map<string,int> have; 
bool ac;
const string next(string t)
{
    if(t=="9T")
        return "End";
    else if(t[1]=='T')
        ++t[0],t[1]='W';
    else if(t[1]=='W')
        t[1]='B';
    else
        t[1]='T';
    return t;
}
bool dfs(const string& last, int u)
{
    if(u>3)
        ac=1;
    for(string i=last;i!="End";i=next(i))
    {
      if(i[0]>='3')
      {
            string i1=i,i2=i;
            i1[0]--;
            i2[0]-=2;
            int m=min(min(have[i],have[i1]),have[i2]); 
            if(m)
            {
                have[i]--;
                have[i1]--;
                have[i2]--;
                dfs(last,u+1);
                have[i]++;
                have[i1]++;
                have[i2]++;
                
            }
      }
      if(have[i]>=3)
      {
          have[i]-=3;
          dfs(last,u+1);
          have[i]+=3;
      }
    }
}
int main()
{
    int n; 
    cin>>n;
    while(n--)
    {
        have.clear();
        string t[15]={};
        for(int i=1;i<=14;++i)
        {
            cin>>t[i];
            if(i>=3)
                have[t[i]]++;
        }
        if(t[1]!=t[2])
        {
            cout<<"No\n";
            continue;
        }
        ac=0;
        dfs("1W",0);
        if(ac)
            cout<<"Yes\n";
        else
            cout<<"No\n";
    }
    return 0;
}

著作权声明[编辑]

关于[编辑]