算法书上面看到了一道题,就是小猫钓鱼的游戏,出牌时,假如某人打出的牌与桌子上的某张牌的牌面相同,即可将两张相同的牌及其中间所夹的牌全部取走,并依此放到本人手牌中的末尾。当任意一人手中的牌全部出完时,游戏结束,对手获胜。(题外话,不是重点)
下面是本人的代码,中间用了一个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 该返回什么?