| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
|---|---|---|---|---|---|
| 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;
}
|