我创造了一个"迷宫"具有类节点的节点的定义:
class Node
{
public:
Node(string newName);
Node();
void setNodeName(string newName);
string getNodeName();
void attachNewNode(Node *newNode, int direction);
Node *getAttachedNode(int direction);
private:
string name;
Node *attachedNodes[4];
};
Node::Node(string newName)
{
name = newName;
}
Node::Node()
{};
void Node::setNodeName(string newName)
{
name = newName;
}
string Node::getNodeName()
{
return name;
}
void Node::attachNewNode(Node *newNode, int direction)
{
attachedNodes[direction] = newNode;
}
Node* Node::getAttachedNode(int direction)
{
return attachedNodes[direction];
}
我在格式中读取文件:
9
A1
C3
A1 A2 B1 * *
A2 * B2 A1 *
A3 * B3 * *
B1 * * * A1
B2 B3 C2 * A2
B3 * * B2 A3
C1 C2 * * *
C2 C3 * C1 B2
C3 * * C2 *
其中9是要创建的节点数,A1是我们将开始导航的节点,C3是我们将尝试查找路径的节点,以下行代表节点本身和它们具有的指针与他们相关联。例如:
A1 A2 B1 * *
表示节点A1的指针指向北方的节点A2,东方的B1,南方的空白,西方的空白。
A2 * B2 A1 *
表示节点A2的指针指向北方的节点null,东方的B2,南方的A1,以及西方的null。
我有一个功能,可以构建"迷宫"存储在映射中的节点,其中字符串键是节点本身的名称。我在地图上运行深度优先搜索,试图找到从起始节点(在文件中指定)到结束节点(也在文件中指定)的路径。
我遇到了如何访问地图片段的麻烦。具体来说,当我尝试DFS代码时:
string getPath()
{
string path;
vector<string> attachedNodes;
stack<string> pathNodes;
pathNodes.push(startNode.getNodeName());
while(!pathNodes.empty())
{
string temp = pathNodes.top();
path += temp + " ";
cout << "Printing Temp." << endl;
cout << "Temp is: " << temp << " in this case." << endl;
if(temp == endNode.getNodeName())
return path;
for(map<string,Node>::iterator it = rooms.begin(); it != rooms.end(); it++)
{
if(it->second.getNodeName() == temp)
{
attachedNodes.push_back(rooms[temp].getAttachedNode(1)->getNodeName());
attachedNodes.push_back(rooms[temp].getAttachedNode(2)->getNodeName());
attachedNodes.push_back(rooms[temp].getAttachedNode(3)->getNodeName());
attachedNodes.push_back(rooms[temp].getAttachedNode(4)->getNodeName());
}
}
pathNodes.pop();
for(int i = 0; i < attachedNodes.size(); i++)
pathNodes.push(attachedNodes[i]);
}
return path;
}
然而,我遇到了各种各样的问题。如果我编译并运行上面的代码,我会看到以下输出:
"Printing Temp."
" in this case."
注意&#34;前面的空格&#34;在这种情况下&#34;并且缺少临时变量。如果我将.substr(0,2)添加到getPath()中的临时赋值中,我会看到无限循环!我如何访问字符串堆栈的top()一定有问题,对吧?救命啊!
编辑:主要方法的代码包括:
main()
{
string file = getFileName(); //reads the file name from user input
buildGraph(file); //builds the map
cout << endl << "The nodes in the current map are:" << endl;
for(map<string,Node>::iterator it = rooms.begin(); it != rooms.end(); it++)
{
cout << "current node: " << it->second.getNodeName() << endl;
if(it->second.getAttachedNode(1)->getNodeName().length() < 3)
cout << it->second.getAttachedNode(1)->getNodeName() << endl;
if(it->second.getAttachedNode(2)->getNodeName().length() < 3)
cout << it->second.getAttachedNode(2)->getNodeName() << endl;
if(it->second.getAttachedNode(3)->getNodeName().length() < 3)
cout << it->second.getAttachedNode(3)->getNodeName() << endl;
if(it->second.getAttachedNode(4)->getNodeName().length() < 3)
cout << it->second.getAttachedNode(4)->getNodeName() << endl;
}
cout << endl;
cout << "Exited for in main." << endl << endl;
string path = getPath();
}
答案 0 :(得分:0)
在这一行:
attachedNodes.push_back(rooms[temp].getAttachedNode(1)->getNodeName());
如果getAttachedNode(1)
返回NULL,那么将尝试在NULL对象上调用getNodeName()
。这很糟糕。
你需要首先检查NULL,这样做会
if (rooms[temp].getAttachedNode(1) != NULL)
attachedNodes.push_back(rooms[temp].getAttachedNode(1)->getNodeName());
但我甚至不确定你为什么要这样做。你正在寻找当前房间的room
,然后当你找到它时,你会使用地图直接找到它。
您也永远不会清除您当地的attachedNodes
变量,因此它会越来越大。您不需要attachedNodes
局部变量,因为您可以使用房间的attachNodes列表。
假设attachNodes始终指向有效房间(或NULL),您可以用以下内容替换这两个循环:
pathNodes.pop();
for(int i = 0; i < 4; i++) {
if (rooms[temp].getAttachedNode(i) != NULL)
pathNodes.push(rooms[temp].getAttachedNode(i));
}
这应该会让你更进一步,但你需要查看你的算法,你目前正在做的就是将所有可用的附加节点推到路径上。