我有以下结构
struct Node
{
int x0,y0,g,h,f;
int *Grid[N][N];
Node* parent=NULL;
Node(int x=0,int y=0,int G=0,Node* node=NULL)
{
x0=x;
y0=y;
g=G;
parent=node;
}
}
和multiset
定义如下
multiset<Node*,GridLess>open_list;
Gridless
是比较运算符的初始结构。
struct GridLess
{
bool operator()(const Node *a,const Node *b) const
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(*a->Grid[i][j]!=*b->Grid[i][j])
{
return *a->Grid[i][j]<*b->Grid[i][j];
}
}
}
return false;
}
};
我的基本需求是使用Node
或open_list
找到multiset::count
中multiset::find
在网格中相同位置的相同元素的Node
比较运算符。
现在我想要open_list
中的Node::g
Node::f
,它在网格中的相同位置具有相同的元素,以及相同的struct GridLess
{
bool operator()(const Node *a,const Node *b) const
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(*a->Grid[i][j]!=*b->Grid[i][j])
{
return *a->Grid[i][j]<*b->Grid[i][j]||(*a->Grid[i][j]==*b->Grid[i][j]&&a->g<b->g)||((*a->Grid[i][j] == *b->Grid[i][j])&&(a->g==b->g)&&a->f<b->f);
}
}
}
return false;
}
};
和Nodes
这是我尝试使用的失败
open_list
在count=2
中使用相同的网格但不同的g或f引入两个Grid
仍会产生Node::g
。
我尝试使用以下
检查return *a->Grid[i][j]<*b->Grid[i][j]||(*a->Grid[i][j]==*b->Grid[i][j]&&a->g<b->g);
和bool operator()
return a<b
即使这样也行不通。
我需要一个比较运算符来解决这个问题并解释它是如何工作的。
修改
我认为我不清楚使用true
函数,因为我们写a<b
时我知道如果a==b
它会返回a>b
但是如果{{{1}}会返回{{1}} {1}}或{{1}}如果可以与问题一起解释,那将非常有用。
答案 0 :(得分:4)
g
和f
成员的比较必须在循环之外。只要它在循环内部,如果g
成员相等,您就不会比较f
和Grid
成员。
struct GridLess
{
bool operator()(const Node *a,const Node *b) const
{
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(*a->Grid[i][j]!=*b->Grid[i][j])
{
return *a->Grid[i][j]<*b->Grid[i][j];
}
}
}
return std::tie(a->g, a->f) < std::tie(b->g, b->f);
}
};
答案 1 :(得分:1)
您的比较运算符表现不佳。首先在循环中比较网格点,返回pointA pointB。如果它们匹配,那么比较其余的东西。
Dunno为什么我的答案被切断了,但它与上面的完整答案相同。我认为不仅仅是开始了一个标签...