对于(可能是)显而易见的问题,我很抱歉,但是我正在起步,希望得到帮助。我尝试了类似问题的解决方案,但没有结果。 我必须制作“河内之塔”算法,但在此算法中,磁盘可以在不同的钉中启动。例如,这是一些可能的输入“ 2 1 0:3:4”,这意味着第一个桩上有3个磁盘,第二个和第三个桩上有1个磁盘; “:1:”,“ 2::1”,等等。 因此,我将其输入:
int main(int argc, char *argv[])
{
stack<int> beg;
stack<int> aux;
stack<int> end;
int stack_pos = 1;
for (size_t i = 1; i < (unsigned)argc; i++) {
cout << "holi" << endl;
if(stack_pos == 1){
if (*argv[i] == ':'){
stack_pos=2;
continue;
}
else if(isdigit(*argv[i])){
//char* temp = argv[i];
//beg.push(atoi(temp));
beg.push(atoi(argv[i]));
continue;
}
else{
cout << "You can't have less than 1 disk, try again." << endl;
}
}
if(stack_pos == 2){
if (*argv[i] == ':'){
stack_pos=3;
continue;
}
else if(isdigit(*argv[i])){
char* temp = argv[i];
aux.push(atoi(temp));
continue;
}
}
if(stack_pos == 3){
if(isdigit(*argv[i])){
char* temp = argv[i];
end.push(atoi(temp));
continue;
} else{
cout << "You can't have more than 3 stacks,try again." << endl;
break;
}
}
}
print_stack(beg);
print_stack(aux);
print_stack(end);
int n = beg.size() + aux.size() + end.size();
//cout << n;
move(n, beg, aux, end);
return 0;
}
基本上遍历列表,直到找到“:”,然后继续填充下一个堆栈,直到下一个“:”为止。 我的move()函数:
void move(int n, stack<int> beg, stack<int> aux, stack<int> end){
if(n==1){
cout<<"\t\tMoved disc "<< end.top() <<" from _ to _ \n";
}else{
move(n-1, beg, end, aux);
move(1, beg, aux, end);
move(n-1, aux, beg, end);
}
return;
}
问题出在我将单个磁盘放在第一个或第二个钉子中时,当我尝试对堆栈大小求和时(或者当我尝试对第一个和第二个钉子做任何事情时),出现分段错误peg。)如果我输入“::1”,它可以正常工作,我可以检查尺寸,知道有0、0和1。
非常感谢您的帮助。