算法与数据结构作业第二次 cards
2014-11-05 00:08
232 查看
刚开始做这题的时候完全没思路,后来了解了队列和栈的知识以后,选择了用双向队列来做。用到了C++STL的库文件<deque>,参考了一些相关函数。参考资料:http://blog.csdn.net/hnust_xiehonghao/article/details/8800007
首先对于每个人手中的牌,将字符型转换为整型。便于之后的计算。写了一个translate函数如下
int translate(char ch[])//将字符类型的牌转换为整型 { int t=0; if(ch[0]!='R') t+=13; if(ch[1]=='A') t+=1; else if(strlen(ch)==3) t+=10; else if(ch[1]=='J') t+=11; else if(ch[1]=='Q') t+=12; else if(ch[1]=='K') t+=13; else t+=ch[1]-'0'; return t; }
接下来,建立三个双向队列a,b,c。分别用来表示Bob,Alice和桌面上的牌堆。模拟整个过程。谁的队列最先为空,谁就获胜。具体代码如下:
#include <iostream>
#include <string.h>
#include <deque>
using namespace std;
bool flag[30];//默认初始值为false
int translate(char ch[])//将字符类型的牌转换为整型 { int t=0; if(ch[0]!='R') t+=13; if(ch[1]=='A') t+=1; else if(strlen(ch)==3) t+=10; else if(ch[1]=='J') t+=11; else if(ch[1]=='Q') t+=12; else if(ch[1]=='K') t+=13; else t+=ch[1]-'0'; return t; }
/*建立三个队列*/
deque<int> a;
deque<int> b;
deque<int> c;
int main()
{
int i;
char ch[5];
for(i=0;i<26;i++)
{
scanf("%s",ch);
a.push_back(translate(ch));//在队列尾部插入元素
}
for(i=0;i<26;i++)
{
scanf("%s",ch);
b.push_back(translate(ch));//在队列尾部插入元素
}
while(1)
{
if(a.empty())//判断a队列是否为空
{
printf("Bob\n");
break;
}
if(!flag[a.front()])//判断当前a队列的队首元素未插入队列c中
{
flag[a.front()]=true;//标记当前a的队首元素已插入队列c中
c.push_back(a.front());//a的队首元素插入c中
a.pop_front();//删除队列a的队首元素
}
/*收回两张相同牌之间所有牌,并标记这些牌不在队列c中,在c队列中删除这些牌*/
else
{
a.push_back(a.front());
while(c.back()!=a.front())
{
flag[c.back()]=false;
a.push_back(c.back());
c.pop_back();
}
flag[c.back()]=false;
a.push_back(c.back());
c.pop_back();
a.pop_front();
}
if(b.empty())
{
printf("Alice\n");
break;
}
if(!flag[b.front()])
{
flag[b.front()]=true;
c.push_back(b.front());
b.pop_front();
}
else
{
b.push_back(b.front());
while(c.back()!=b.front())
{
flag[c.back()]=false;
b.push_back(c.back());
c.pop_back();
}
flag[c.back()]=false;
b.push_back(c.back());
c.pop_back();
b.pop_front();
}
}
return 0;
}
根据今天算法课同学的优秀作业再提供两种解法:
①用两个队列模拟出牌的顺序,每次从队首出牌,从队尾进牌,用一个栈来容纳出的牌,由于收牌时越晚出的牌放越上面,所以赢牌时,从栈顶出来,从队尾进入队列,这样直到有一个人没有牌。
②采用双向链表,这种方法在将桌面上的牌堆收回的时候较方便,只想要将前驱指针,后继指针转向即可。
其实这次的主要是考察表的相关知识,用单向链表即可实现这个模拟过程,复习过表以后,会尝试自己写。同时在复习到栈和队列的时候,回来对时间的复杂度进行分析。
相关文章推荐
- 第二次数据结构作业
- 数据结构与算法 Data Structures and Algorithms(作业1)
- 【数据结构作业一】写出顺序表的结构体类型定义及查找、插入、删除算法,并以顺序表作存储结构,实现线性表的插入、删除
- C++表达式求值(Stack and Expression)加州大学伯克利分校计算机专业数据结构与算法作业
- 第二次数据结构作业
- C++队列模拟银行排队叫号(加州大学伯克利分校计算机专业数据结构与算法作业)
- 【数据结构作业二】写出单链表结点的结构体类型定义及查找、插入、删除算法,并以单链表作存储结构,实现有序表的合并
- 数据结构.算法 近期计划
- Linux C 函数参考(数据结构及算法)
- 十四、数据结构相关算法
- 数据结构知识——树的三种不同遍历算法解析
- 数据结构教程 第四课 算法效率的度量和存储空间需求
- 数据结构与算法(C#实现)系列---二叉树
- Pku acm 1274 The Perfect Stall 数据结构题目解题报告(十三)---- 匈牙利算法求二分图的最大匹配
- 数据结构及算法-算法是什么?
- Pku acm 1125 Stockbroker Grapevine 数据结构题目解题报告(八)---- 弗洛伊德(floyd)算法
- 数据结构与算法(C#实现)系列---演示篇(一)(外摘)
- 基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)
- 数据结构与算法(C#实现)系列---AVLTree(二)(外摘)