纸牌游戏——小猫钓鱼(阿哈!算法)
来源:互联网 发布:手机自制漫画软件 编辑:程序博客网 时间:2024/04/28 12:53
问题描述:
小哼和小哈在玩一个比较奇怪的扑克游戏——小猫钓鱼。游戏规则:将一副扑克牌平均分成两份,没人拿一分。小哼先拿出手中第一张扑克牌放在桌上,然后小哈也拿出手中第一张扑克牌,并放在小哼刚才打出的扑克牌的上面,两人交替出牌。出牌时,如果某人打出的牌与桌上某张牌的牌面相同,可将两张相同的牌及其中间所夹的牌全部拿走,并依次放到自己手中牌的末尾。当任意一人手中当牌出完时,游戏结束,对方获胜。
分析:
1、这个游戏一共有两种操作:出牌和赢牌。
出牌即出队,赢牌即入队。
2、桌面相当于一个栈,出牌即入栈,赢牌即出栈。
3、通过枚举了解桌面有哪些牌。
思路:
1、定义两个队列q1、q2表示小哼、小哈手中的牌。
2、定义一个栈s表示桌面的牌
3、定义数组book记录桌面上已经出现的牌面
4、游戏开始时q1的队首出队,判断当前时是出牌还是赢牌
4.1如果是出牌,则入栈
4.2如果是赢牌,则q1的队首到队尾,再将赢得的牌依次入队
5、q2 的队首出队,操作同4
6、第4、5步重复进行直至任意人手中没有牌
7、输出赢的人手中的牌,输出此时桌面上的牌
代码:
(此部分代码为书上提供)
#include <stdio.h>struct queue{ int data[1000]; int head; int hail;};struct stack{ int data[10]; int top;};int main(int argc, const char * argv[]) { struct queue q1,q2; struct stack s; int book[10]={0}; //用来标记哪些牌已经在桌子上 int i,t; //初始化队列 q1.head=1; q1.hail= 1; q2.head=1; q2.hail=1; //初始化栈 s.top=0; //依次向队列输入6个数 for(i=1;i<=6;i++) { scanf("%d",&q1.data[q1.hail]); q1.hail++; } for(i=1;i<=6;i++) { scanf("%d",&q2.data[q2.hail]); q2.hail++; } while(q1.head<q1.hail&&q2.head<q2.hail) { t=q1.data[q1.head]; //q1打出第一张牌 //判断q1当前打出的牌是否能赢牌 if(book[t]==0)// 表面桌上没有牌面为t的牌 { //q1此轮不能赢牌 q1.head++;//q1打出一张牌,打出的那张牌出队 s.top++; s.data[s.top]=t;//q1打出的牌入栈 book[t]=1;//标记已打出的牌t } else {//q1此轮可以赢牌 q1.head++;//q1打出第一张牌 q1.data[q1.hail]=t;//q1打出的牌放到队尾 q1.hail++; while(s.data[s.top]!=t)//将赢得的牌依次入队 { q1.data[q1.hail]=s.data[s.top]; q1.hail++; s.top--; book[s.data[s.top]]=0;//将从桌面入队的牌取消标记 } } t=q2.data[q2.head];//q2出牌 if(book[t]==0) //q2此轮不能赢牌 { q2.head++; s.top++; s.data[s.top]=q2.data[q2.head]; book[t]=1; } else { //q2此轮能赢牌 q2.data[q2.hail]=q2.head; q2.head++; q2.hail++; while(s.data[s.top]!=t) { q2.data[q2.hail]=s.data[s.top]; q2.hail++; book[s.data[s.top]]=0; s.top--; } } } if(q2.head==q2.hail) { printf("q1 win!\n"); printf("q1当前手中的牌是:\n"); for(i=q1.head;i<q1.hail;i++) { printf("%d ",q1.data[i]); } if(s.top>0)// { printf("\n桌上的牌是:\n"); for(i=1;i<=s.top;i++) { printf("%d ",s.data[i]); } } else printf("\n桌上已经没有牌!\n"); } else if(q1.head==q1.hail) { printf("q2 win!\n"); printf("q2当前手中的牌是:\n"); for(i=q2.head;i<q2.hail;i++) { printf("%d ",q2.data[i]); } if(s.top>0)// { printf("\n桌上的牌是:\n"); for(i=1;i<=s.top;i++) { printf("%d ",s.data[i]); } } else printf("\n桌上已经没有牌!\n"); } getchar(); getchar(); return 0;}
0 0
- 纸牌游戏——小猫钓鱼(阿哈!算法)
- 啊哈!算法—纸牌游戏—小猫钓鱼
- [数据结构]纸牌游戏——小猫钓鱼
- 2.3纸牌游戏——小猫钓鱼
- 纸牌游戏——小猫钓鱼
- 纸牌游戏——小猫钓鱼
- 算法入门——小猫钓鱼纸牌
- 纸牌游戏-小猫钓鱼
- 纸牌游戏--小猫钓鱼
- java实现纸牌游戏-小猫钓鱼算法
- 纸牌游戏——小猫钓鱼 栈与队列合用实现
- 寒假算法第三编——小猫钓鱼游戏(栈与队列综合问题)
- C语言—算法—小猫钓鱼
- 纸牌游戏-小猫钓鱼(队列和栈的基本应用)
- 小猫钓鱼游戏java实现
- 小猫钓鱼
- 浅析:纸牌游戏 Java算法——之重复发牌
- 小猫钓鱼偶感!
- ef 6.0 生成的sql 语句 参数类型 修改 varchar nvarchar
- SQL 主键的用法
- 欢迎使用CSDN-markdown编辑器
- Java中栈内存和堆内存总结
- 文章标题
- 纸牌游戏——小猫钓鱼(阿哈!算法)
- SQL ALTER TABLE的用法
- nodejs(数据查询功能1)
- 第一届全国高校软件定义网络(SDN)应用创新开发大赛--我的sdn实践
- 数字视频编解码基础
- deque demo
- oenwrt 中的调试文件系统
- Codeforces Round #293 (Div. 2)
- Thrift 的序列化机制