UVa 127 纸牌游戏(栈)

https://vjudge.net/problem/UVA-127

题意:

按从左至右的顺序发牌,并摆成一行,发牌不要相互重叠。游戏中一旦出现任何一张牌与它左边的第一张或第三张“匹配”,即花色或点数相同,则须立即将其移动到那张牌上面。如果牌被移动后又出现了上述情况,则需再次向左移动。每叠牌只能移动最上面的一张。如果一叠牌被移空,应该立即将右边各叠整体向左移动,补上这个空隙。依次将整副牌都发完,并不断的向左合并。输出最后的牌堆数以及各牌堆的牌数。

 

思路:

代码虽然写着挺长,但题目很简单。用栈解决。

每个牌堆用一个栈来表示,如果牌堆空了也不需要左移啥的,如果栈空则跳过它就好了。每次移动之后,需要重新去前面的那个牌堆开始检验。

 1 #include<iostream> 
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stack>
 6 using namespace std;
 7 
 8 struct node
 9 {
10     char str[3];
11 }c[55];
12 
13 int main()
14 {
15     //freopen("D:\\txt.txt", "r", stdin);
16     while (cin >> c[0].str)
17     {
18         if (c[0].str[0] == '#')  break;
19         stack<node> sta[55];
20         sta[0].push(c[0]);
21         for (int i = 1; i < 52; i++)
22         {
23             cin >> c[i].str;
24             sta[i].push(c[i]);
25         }
26         for (int i = 1; i < 52; i++)
27         {
28             if (sta[i].empty())     continue;  //如果第i堆牌为空,继续下一堆
29             int cnt = 0;
30             int t = i - 1;
31             while (t >= 0)
32             {
33                 if (!sta[t].empty())
34                     cnt++;
35                 if (cnt == 3)  break;    //找到i左边第3个牌堆
36                 t--;
37             }
38             if (cnt==3)
39             {
40                 node s1 = sta[t].top();
41                 node s2 = sta[i].top();
42                 if (s1.str[0] == s2.str[0] || s1.str[1] == s2.str[1])
43                 {
44                     sta[i].pop();
45                     sta[t].push(s2);
46                     i = t-1;
47                     continue;     //如果和第3个匹配,则不再进行左边第1个的匹配
48                 }
49             }
50             t = i - 1;
51             while (t >= 0 && sta[t].empty())  t--;
52             if (t >= 0)
53             {
54                 node s1 = sta[t].top();
55                 node s2 = sta[i].top();
56                 if (s1.str[0] == s2.str[0] || s1.str[1] == s2.str[1])
57                 {
58                     sta[i].pop();
59                     sta[t].push(s2);
60                     i = t-1;  //重新去检查第t个牌堆,因为循环最后会i++,所以这里i要等于t-1
61                 }
62             }
63         }
64         int num[52];
65         int cnt = 0;
66         for (int i = 0; i < 52; i++)
67         {
68             if (sta[i].size() != 0)
69                 num[cnt++] = sta[i].size();
70         }
71         cout << cnt << " pile";
72         if (cnt>1)  cout << "s";
73         cout << " remaining:";
74         for (int i = 0; i < cnt; i++)
75             cout << " "<< num[i];
76         cout << endl;
77     }
78     return 0;
79 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6379785.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值