摘要

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


题意

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

题解

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

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

不算太复杂。

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


代码

1524.cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<string>
  2. #include<map>
  3. #include<iostream>
  4. using namespace std;
  5. map<string,int> have;
  6. bool ac;
  7. const string next(string t)
  8. {
  9. if(t=="9T")
  10. return "End";
  11. else if(t[1]=='T')
  12. ++t[0],t[1]='W';
  13. else if(t[1]=='W')
  14. t[1]='B';
  15. else
  16. t[1]='T';
  17. return t;
  18. }
  19. bool dfs(const string& last, int u)
  20. {
  21. if(u>3)
  22. ac=1;
  23. for(string i=last;i!="End";i=next(i))
  24. {
  25. if(i[0]>='3')
  26. {
  27. string i1=i,i2=i;
  28. i1[0]--;
  29. i2[0]-=2;
  30. int m=min(min(have[i],have[i1]),have[i2]);
  31. if(m)
  32. {
  33. have[i]--;
  34. have[i1]--;
  35. have[i2]--;
  36. dfs(last,u+1);
  37. have[i]++;
  38. have[i1]++;
  39. have[i2]++;
  40. }
  41. }
  42. if(have[i]>=3)
  43. {
  44. have[i]-=3;
  45. dfs(last,u+1);
  46. have[i]+=3;
  47. }
  48. }
  49. }
  50. int main()
  51. {
  52. int n;
  53. cin>>n;
  54. while(n--)
  55. {
  56. have.clear();
  57. string t[15]={};
  58. for(int i=1;i<=14;++i)
  59. {
  60. cin>>t[i];
  61. if(i>=3)
  62. have[t[i]]++;
  63. }
  64. if(t[1]!=t[2])
  65. {
  66. cout<<"No\n";
  67. continue;
  68. }
  69. ac=0;
  70. dfs("1W",0);
  71. if(ac)
  72. cout<<"Yes\n";
  73. else
  74. cout<<"No\n";
  75. }
  76. return 0;
  77. }
  78.  

著作权声明[编辑]

关于[编辑]