算法书上面看到了一道题,就是小猫钓鱼的游戏,出牌时,假如某人打出的牌与桌子上的某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依此放到本人手牌中的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(题外话,不是重点)
下面是本人的代码,中间用了一个end函数,调试中发现其返回的是最后一个值的下一个位置,而且该位置的值初始化为0了,这令本人很疑惑,麻烦各位高手帮本人看看究竟出了什么问题,代码如下:
下面是本人的代码,中间用了一个end函数,调试中发现其返回的是最后一个值的下一个位置,而且该位置的值初始化为0了,这令本人很疑惑,麻烦各位高手帮本人看看究竟出了什么问题,代码如下:
//小猫钓鱼算法
#include<iostream>
#include<deque>
#include<vector>
using namespace std;
int main()
{
deque<int> dui;
deque<int> xiaohong,xiaoming;
int card;
cout<<"请输入小明的手牌:";
while(cin>>card){
xiaoming.push_back(card);
if(cin.get()=="\n")
break;
}
cout<<"请输入小红的手牌:";
while(cin>>card){
xiaohong.push_back(card);
if(cin.get()=="\n")
break;
}
while(xiaoming.size() != 0 && xiaohong.size() != 0)
{
deque<int>::iterator mt=xiaoming.begin(),ht=xiaohong.begin(),point;
//小明出手。
int flag=0;
//检查能否可以赢牌。
for(deque<int>::iterator beg=dui.begin(); beg!=dui.end(); ++beg){
if(*beg==*mt){
flag=1;
}
}
//不赢牌的操作。
if(flag==0){
dui.push_back(*mt);
xiaoming.pop_front();
}
//赢牌的操作。
if(flag==1){
xiaoming.push_back(*mt);
xiaoming.pop_front();
point=dui.end()-1; //要问的就是这里的end,返回的是下一个位置,原以为
//是未定义的,但调试发现该处值初始化为了0。手动减去1程序
//运算结果正确。
while(*point!=*mt){
xiaoming.push_back(*point);
dui.erase(point);
--point;
}
xiaoming.push_back(*point);
dui.erase(point);
}
//检查小明能否打完了。
if(xiaoming.size()==0)
break;
//小红出手。
flag=0;
for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
if(*beg==*ht){
flag=1;
}
}
if(flag==0){
dui.push_back(*ht);
xiaohong.pop_front();
}
if(flag==1){
xiaohong.push_back(*ht);
xiaohong.pop_front();
point=dui.end()-1;
while(*point!=*ht){
xiaohong.push_back(*point);
dui.erase(point);
--point;
}
xiaohong.push_back(*point);
dui.erase(point);
}
}
if(xiaohong.size()==0)
{
cout<<"小明胜利!"<<endl;
if(dui.size() != 0){
cout<<"此时桌子上的牌有:";
for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
cout<<*beg<<" ";
}
cout<<endl;
}
else
cout<<"此时桌子上已经没有牌了!"<<endl;
cout<<"此时小明的手牌有:";
for(deque<int>::iterator beg =xiaoming.begin();beg!=xiaoming.end();++beg){
cout<<*beg<<" ";
}
cout<<endl;
}
if(xiaoming.size()==0){
cout<<"小红胜利!"<<endl;
if(dui.size()!= 0){
cout<<"此时桌子上的牌有:";
for(deque<int>::iterator beg=dui.begin();beg!=dui.end();++beg){
cout<<*beg<<" ";
}
cout<<endl;
}
else
cout<<"此时桌子上已经没有牌了!"<<endl;
cout<<"此时小红的手牌有:";
for(deque<int>::iterator beg =xiaohong.begin();beg!=xiaohong.end();++beg){
cout<<*beg<<" ";
}
cout<<endl;
}
return 0;
}
解决方案
8
第一个问题:看下标准和具体的实现
第二个问题:本人验证一下,然后想想为什么;
7
就是返回最后一个元素的下一个,标准要求的。
5
end()指向最后一个元素之后,这是一种编程假定,迭代器都是左闭右开式的。deque在任何位置添加元素都会使iter失效,这是由deque内存形式决定的(分块链表形式)
10
5
[begin,end)
为了计算end-begin方便
为了计算end-begin方便
5
这是一种‘哨兵’设计理念。end相当于一个‘哨兵’,当你在遍历‘队伍’到这个哨兵时说明已经结束了
5
容器为空的时候 end 该返回什么?