递归拼图你被给了一个拼图,其中包含一行正方形,每个正方形包含一个整数,就像这样
初始方块上的圆圈是一个标记,可以移动到该行的其他方块。在拼图的每个步骤中,您可以将标记移动到当前占据的方格中的整数所指示的方块数。标记可以沿着行向左或向右移动但可以不移动经过任一端。例如,唯一合法的第一步是将标记向右移动三个方格,因为没有空间向左移动三个空格。拼图的目标是将标记移动到行的远端的0。在此配置中,您可以通过以下一组移动来解决难题:
https://i.stack.imgur.com/yUz3P.png
一个。编写一个算法void SolvePuzzle(int start,int squares [1..n]),它采用标记的起始位置和正方形数组。该算法应该从起始配置解决难题,并显示在序列结束时达到0所需的所有移动。您可以假设数组中的所有整数都是正数,除了最后一个条目,即目标平方,它始终为零。调用函数之后,数组中元素的值必须相同(也就是说,如果在处理过程中更改它们,则需要将其更改回来!)
void SolvePuzzle(int start, int squares[]){
if(squares[start]==0)
return;
else{
cout<<squares[start]<<" ";
if(squares[start]%2==0)
SolvePuzzle( start+squares[start],squares);
else
SolvePuzzle( start-squares[start],squares);
}
}
int main(){
int arraytest[] = { 3, 6, 4, 1, 3, 4, 2, 5, 3, 0 };
SolvePuzzle(arraytest[0],arraytest);
return 0;
}
我这样解决但我需要在If语句
中纠正错误答案 0 :(得分:0)
你所面临的问题,即使你无法从你的描述中得知,你不知道你是否必须向左或向右移动来解决难题。
最简单的方法就是试着向左走,如果有效,你就解决了,否则你就走对了。这意味着您必须更改功能,否则您无法真正返回正确的路径或答案。
可能看起来像这样:
#include <vector>
#include <iostream>
bool SolvePuzzle(int squares[], int size, int position,
std::vector<bool>& go_right_sol){
if(squares[position]==0){
return true;
}
int leftPos = position - squares[position];
int rightPos = position + squares[position];
if(rightPos < size && SolvePuzzle(squares, size, rightPos, go_right_sol)){
go_right_sol.insert(go_right_sol.begin(), true);
return true;
}
if(leftPos > 0 && SolvePuzzle(squares, size, leftPos, go_right_sol)){
go_right_sol.insert(go_right_sol.begin(), false);
return true;
}
return false;
}
int main(){
int arraytest[] = { 3, 6, 4, 1, 3, 4, 2, 5, 3, 0 };
int arraysize = 10;
std::vector<bool> solution;
SolvePuzzle(arraytest, arraysize, 0, solution);
for(int i = 0; i < solution.size(); i++){
std::cout << ((solution[i]) ? "right" : "left") << " - ";
}
std::cout << std::endl;
return 0;
}