C++ 骑士巡游通过数组到链表和更多

C++ 骑士巡游通过数组到链表和更多,c++,arrays,linked-list,stack,C++,Arrays,Linked List,Stack,我目前正在从事骑士之旅项目。我的最终目标是通过实现stack和Warnsdorff的启发式,使用回溯创建这个项目。我不允许使用任何已经创建了堆栈函数的库,比如push和pop。我也不允许使用递归来解决这个问题。话虽如此,但我现在非常困惑,我的下一个重要里程碑将是通过回溯来解决问题 我根本不打算粉饰这一点,但现在我的代码一团糟。我几乎已经创建了使程序运行所需的所有工具,但现在我只需要把所有的部分放在一起 以下是我的代码: #include<iostream> using namespa

我目前正在从事骑士之旅项目。我的最终目标是通过实现stack和Warnsdorff的启发式,使用回溯创建这个项目。我不允许使用任何已经创建了堆栈函数的库,比如push和pop。我也不允许使用递归来解决这个问题。话虽如此,但我现在非常困惑,我的下一个重要里程碑将是通过回溯来解决问题

我根本不打算粉饰这一点,但现在我的代码一团糟。我几乎已经创建了使程序运行所需的所有工具,但现在我只需要把所有的部分放在一起

以下是我的代码:

#include<iostream>
using namespace std;

class linkedList{

struct node
{
    int data;
    node *next;
};

node *top;

public:
linkedList()
{
    top = NULL;
}
void push(int coordinates)
{
    node *p = new node;
    p -> data = coordinates;
    p -> next = top;
    top = p;
}
int pop()
{
    node *temp = top;
    top = temp -> next;
    return temp -> data;
}
int display()
{
        cout<<"\n"<< top -> data;
        top = top-> next;

}

};


// Linked List ================================================

class Board{
public:
int next;
int status[8][8];
Board();
void print();
};

Board::Board(){

  for(int i=0; i<8; i++){
    for(int j=0; j<8; j++){
      status[i][j] = -1;
    }
  }

}//constructor


void Board::print(){

  for (int j=0; j<8; j++){
    for(int i=0; i<8;i++){
      cout << status[i][j] << "   ";
    }
    cout << endl << endl;
  }

}
//BOARD========================================================

class Knight {

 private:
 public:
int vertical[8] = {2,-2,1,-1,2,-2,1,-1}; // possible knight moves x coordinate
int horizontal[8] = {1,1,2,2,-1,-1,-2,-2}; // possible knight move y coordinate
int counter;
int currentPos[2];
Knight();
};

Knight::Knight(){
currentPos[0] = 7; // x-coordiante
currentPos[1] = 7; // y-coordinate
counter = 0;

}//constructor

/* Use this later

int Knight::changePos(int i,int j){

Knight::currentPos[0] = (Knight::currentPos[0] + i);
Knight::currentPos[1] = (Knight::currentPos[1] + j);
counter++;
return counter;
*/

int main(){
    Board b;
    Knight k;

    b.status[k.currentPos[0]][k.currentPos[1]] = k.counter;
    b.print();

    linkedList obj;
    int coordinates;
}

因此,在这一点上,我的想法是做以下工作:

创建一个循环,将使用水平和垂直阵列更改骑士的当前位置,以确定骑士的可能移动。一旦位置改变,计数器将递增,-1将替换为当前计数器值。当骑士被移动时,需要使用我创建的push函数将新坐标的信息传递到链表。为了做到这一点,我需要找到一种方法来传递一个数组x、y或多个值来推动。我还需要创建一些绑定检查,这是我目前正在进行的工作,以确保骑士不会移动到他去过的地方,也不会离开棋盘。最后,如果骑士真的被卡住了,我需要使用我创建的pop函数返回一步并尝试继续另一步


我真的非常感谢任何帮助,纠正,地方开始或其他建议,给予!我太困了。

让我直说吧。您很难实现允许撤消移动的堆栈结构

C++并不是我的强项,但下面是我处理堆栈的方法

定义一个存储坐标和可能的回溯信息的结构 更新“节点”以存储指向新结构实例的指针。 更新“推送”定义以使用它。 更新“pop”定义以返回它。 利润
我可以指出,你不需要一个动态增长的链表吗?堆栈的最大大小是N*N板上的总方块数。因此,您可以使用一个数组和当前叠加到其中的移动次数。@BenVoigt选择使用二维坐标还是展平坐标平面无关紧要。他需要一种方法来存储坐标,并可能为每一步提供更多信息,以便有效地回溯。