啊哈!算法—纸牌游戏—小猫钓鱼
2016-04-28 12:24
260 查看
扑克游戏:
将一副扑克牌平均分成两份,每人拿一份。小哼先拿出手中的第一张扑克牌放在桌上,然后小哈也拿出手中的第一张放在桌上,就这样两人交替出牌。
出牌时,若某人打出的牌与桌面上的某张牌面相同,即将两张相同的牌以及中间的全部取走,并依次放在自己手中牌的末尾。当任意一人手中的牌全部取完时,游戏结束,对手获胜。
思路:
小哼和小哈有两种操作:出牌和赢牌,即对应出队和入队。桌子即相当于栈,打出一张牌和取走牌对应入栈和出栈。
程序如下:#include <iostream> using namespace std; struct queue { int data[1000]; int head; int tail; }; struct stack { int data[10]; int top; }; int main() { struct queue q1,q2; struct stack s; int i,t,book[10]; //初始化队列 q1.head=1; q1.tail=1; q2.head=1; q2.tail=1; //初始化栈 s.top=0; //初始化用来标记的数组,用来标记哪些牌已经放在桌上 for(i=1; i<=9; i++) book[i]=0; //依次向队列中插入6个数,即小哼和小哈手中的牌 for(i=1; i<=6; i++) { cin>>q1.data[q1.tail]; q1.tail++; } for(i=1; i<=6; i++) { cin>>q2.data[q2.tail]; q2.tail++; } while(q1.head<q1.tail&&q2.head<q2.tail) //当队列不为空时循环 { t=q1.data[q1.head]; //小哼出第一张牌 //判断小哼是否赢牌 if(book[t]==0) //表示桌面上没有此牌 { q1.head++; //打出的牌出队 s.top++; //打出的牌入栈 s.data[s.top]=t; book[t]=1; //标记桌面上有此牌 } else { //小哼赢得此牌 q1.head++; //打出的牌入队 q1.data[q1.tail]=t; q1.tail++; while(s.data[s.top]!=t) //把桌上可以赢得的牌依次放入手中牌的末尾 { book[s.data[s.top]]=0; //取消标记 q1.data[q1.tail]=s.data[s.top]; //依次放入末尾 q1.tail++; s.top--; //栈中少了一张牌,栈减1 } //收回桌上牌面为t的牌 book[s.data[s.top]]=0; q1.data[q1.tail]=s.data[s.top]; q1.tail++; s.top--; } if(q1.head==q1.tail) //小哈手中的牌如果已经打完,游戏结束 break; //小哈出牌同小哼 t=q2.data[q2.head]; if(book[t]==0) { q2.head++; s.top++; s.data[s.top]=t; book[t]=1; } else { q2.head++; q2.data[q2.tail]=t; q2.tail++; while(s.data[s.top]!=t) { book[s.data[s.top]]=0; q2.data[q2.tail]=s.data[s.top]; q2.tail++; s.top--; } book[s.data[s.top]]=0; q2.data[q2.tail]=s.data[s.top]; q2.tail++; s.top--; } } if(q2.head==q2.tail) { cout<<"小哼win"<<endl; cout<<"小哼当前手中的牌是:"; for(i=q1.head; i<=q1.tail-1; i++) cout<<q1.data[i]<<" "; if(s.top>0) { cout<<"\n桌上的牌是:"; for(i=1; i<=s.top; i++) cout<<s.data[i]<<" "; } else cout<<"桌上已经没有牌了!"<<endl; } else { cout<<"小哈win"<<endl; cout<<"小哈当前手中的牌是:"; for(i=q2.head; i<=q2.tail-1; i++) cout<<q2.data[i]<<" "; if(s.top>0) { cout<<"\n桌上的牌是:"; for(i=1; i<=s.top; i++) cout<<s.data[i]<<" "; } else cout<<"桌上已经没有牌了!"<<endl; } cout<<endl; return 0; }
运行结果:
学习心得:
栈和队列涉及的程序,就像小孩学步一样,按照原有的步骤,将其模拟一遍,得到最终的结果。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析