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