解决方法#:
的定义检查重复数字不是问题,但我似乎无法想出一个检查“runaround”部分的好方法。我正在寻找比实际c ++更多的建议/伪代码。
答案 0 :(得分:1)
如果你将整数转换成一个字符串,它应该没有任何困难:你需要的只是一个operator [](std :: string类提供)和一个boolean数组,用于记录哪个元素已被检查:
string value = input_integer;
vector<bool> checked;
int index = value[0];
checked[0] = true;
bool done = false;
while (!done) {
index = get_wrapped_index(value, index);
if (!checked[index])
checked[index] = true;
else
return false; // not a roundaround
if allTrue(checked) && index == 0
done = true;
}
return true;
你必须编写get_wrapped_index(string s,index i)代码,它必须返回s [i]指定的整数,给定由问题指定的右包装costraint。
答案 1 :(得分:0)
您有4条规则,所以只需编写代码来检查每条规则。
该数字为N位数。确定N是什么。可以通过转换为每个数字的字符串或向量来完成。您可能需要使用除以10和mod(%)10几次。
从一位移到下一位的方法。因此,如果您在数字位置x具有值y,则移动到x + y mod N,即(x + y)%N。当然,第一个位置被认为是位置0。
您需要检查是否触摸了每个位置,并且还没有重复。这可能是一个检查。如果您知道自己拥有正确的解决方案,并且只有当这是第N次迭代并且您处于索引0时才达到您所见过的数字。
12是失败。因为虽然它是在2次迭代之后你没有达到索引0但是重新访问索引1(2将你从索引1带回到索引1)
11是失败的,因为当你还没有完成所有迭代时,你会看到另一个1。
123失败了,因为你过早地回到1迭代。你不需要知道你没有看到3,或者你回到索引0,只是你太早看到了另一个。
但是,285有效。你看到2然后是5然后是8然后2.你在索引0并且有3次迭代。您需要存储一组看到过的数字。 vector有点争议,所以你可以使用std :: bitset甚至只是bool [10]会为这个例子或者vector做。您也可以使用std :: set,后一种情况允许您检查其大小以查看迭代次数。