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