刚开始做这题的时候完全没思路,后来了解了队列和栈的知识以后,选择了用双向队列来做。用到了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;
}
根据今天算法课同学的优秀作业再提供两种解法:
①用两个队列模拟出牌的顺序,每次从队首出牌,从队尾进牌,用一个栈来容纳出的牌,由于收牌时越晚出的牌放越上面,所以赢牌时,从栈顶出来,从队尾进入队列,这样直到有一个人没有牌。
②采用双向链表,这种方法在将桌面上的牌堆收回的时候较方便,只想要将前驱指针,后继指针转向即可。
其实这次的主要是考察表的相关知识,用单向链表即可实现这个模拟过程,复习过表以后,会尝试自己写。同时在复习到栈和队列的时候,回来对时间的复杂度进行分析。