您的位置:首页 > 理论基础 > 数据结构算法

算法与数据结构作业第二次 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;
}



根据今天算法课同学的优秀作业再提供两种解法:

①用两个队列模拟出牌的顺序,每次从队首出牌,从队尾进牌,用一个栈来容纳出的牌,由于收牌时越晚出的牌放越上面所以赢牌时,从栈顶出来,从队尾进入队列,这样直到有一个人没有牌。

②采用双向链表,这种方法在将桌面上的牌堆收回的时候较方便,只想要将前驱指针,后继指针转向即可。

其实这次的主要是考察表的相关知识,用单向链表即可实现这个模拟过程,复习过表以后,会尝试自己写。同时在复习到栈和队列的时候,回来对时间的复杂度进行分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐