这是我为Topcoder SRM编写的代码。但是这里存在一个我无法弄清楚的分段错误。你能帮我解决一下吗?
问题是 -
这项任务是关于模拟游戏Yahtzee第一阶段的得分,其中使用了五个骰子。得分由滚动后向上模具面上的值确定。玩家可以选择一个值,所有显示所选值的骰子都被认为是活动的。分数只是活动骰子上的值的总和。 比方说,例如,玩家最终会出现显示2,2,3,5和4的模具面。选择值2会使骰子显示2活动并产生2 + 2 = 4的分数,同时选择5个制作一个模具显示5个活跃,得分为5。 你的方法将把矢量投掷作为输入,其中每个元素代表骰子的向上面,并用这些值返回最大可能得分。
约束 -
折腾将完全包含五个元素。 每个元素都在1到6之间
#include <iostream>
#include <vector>
using namespace std;
class YahtzeeScore
{
public:
int maxPoints(vector<int> toss);
};
int YahtzeeScore::maxPoints(vector <int> toss)
{
vector<int> ret;
vector <int>::iterator v = toss.begin();
vector<int>::iterator w = toss.begin();
for (;v != toss.end(); v++)
{
int s=0;
for (;w != toss.end(); w++)
{
if ( w!=v && *w==*v) s++;
}
ret.push_back(s);
}
vector<int>::iterator it = ret.begin();
for (; it!=ret.end(); it++)
{
if (*v>*(v+1))
{
int temp = *v;
*v = *(v+1);
*(v+1)=temp;
}
}
return ret[4];
}
int main()
{
YahtzeeScore ob;
vector<int> something;
vector<int>::iterator it = something.begin();
while (it != something.end())
{
int a;
cin >> a;
something.push_back(a);
}
cout << ob.YahtzeeScore::maxPoints(something);
}
答案 0 :(得分:1)
在if (*v>*(v+1))
行,v
指向end
,因此您无法取消引用它。
我猜你的意思是it
而不是v
,但是如果*(it+1)
指向一端,那么it
仍然无效。
另外,您应该在执行ret
之前检查ret[4]
的大小。或者ret.at(4)
,所以至少你得到一个例外而不是段错误。
答案 1 :(得分:1)
注意:您应该通过调试器运行它。
main()中的这段代码:
vector<int>::iterator it = something.begin();
while (it != something.end())
it
将永远是something.end(),因为某些东西是空的。这意味着它永远不会读取任何输入,这意味着您将空向量传递给maxPoints
。由于maxPoints
为空且toss
为空,ret
个循环都不会运行。所以ret[4]
会导致段错误。
如您所知,您需要5个输入,只需使用以下内容:
for (int i = 0; i < 5; i++)
{
int a;
cin >> a;
something.push_back(a);
}
答案 2 :(得分:0)
问题的根源在这个块中:
while (it != something.end())
{
int a;
cin >> a;
something.push_back(a);
}
首次进行检查,it == something.end()
,因为something
为空。
您将空对象传递给ob.YahtzeeScore::maxPoints()
,return ret[4]
尝试从空向量({{1}})获取第5个项目,这会导致分段违规。
答案 3 :(得分:0)
执行一个简单的循环for( int face=1; face<6; face++)
并对五个面进行6次扫描以获得相等的face
。求它们并存储找到的最大总和。完成。
答案 4 :(得分:0)
Vector不会初始化,这会导致返回ret [4]时出现段错误。
vector<int> something;
vector<int>::iterator it = something.begin();
while (it != something.end())
这个循环永远不会运行,因为vector是空的并且它指向something.end(),
和循环结束,其中包含0个元素。
考虑到包含至少5个元素的东西比你调用maxPoints。
由于某些内容不包含任何内容,return ret[4];
不正确,因此您获得了segfaul。
建议:
- maxPoints有明确的前提条件:toss.size()== 5.使用断言
- 我建议使用maxPoints(const vector<int> & toss);
,这将消除不必要的副本。