我如何比较两个状态的8个谜题,因为“一个状态小于 另一个状态当且仅当第一个状态的中心单元格中的值小于第二个状态的中心单元格中的值时。“状态在3 * 3拼图或板中,状态存储在队列中(如问题所要求的。)
我正在尝试使用重载运算符< 。但它不起作用。我在这里附上了编码的一些部分。如果有人可以提供帮助,真的很有帮助!
#ifndef STATE_H_INCLUDED
#define STATE_H_INCLUDED
const int BOARDSIZE = 3;
const int Size=1;
class State
{
private:
int grid[BOARDSIZE][BOARDSIZE];
public:
State() {
for( int i=0;i<BOARDSIZE;i++){
for( int j=0;j<BOARDSIZE;j++){
cin >> grid[i][j];
}
}
}
State(const State& s) {
for(int i=0;i<BOARDSIZE;i++)
for(int j=0;j<BOARDSIZE;j++)
grid[i][j] = s.getValue(i,j);
}
bool operator <(State s) const {//problem is probably somewhere here
if(grid[1][1] < s.getValue(1,1));
return false;
return true;
}
};
以下是.cpp
:
while (!q.empty()){
q.front().printBoard();
if(q.front()<p){
cout<<"Less than previous!"<<endl;
break;
}
q.pop();
cout<<endl;
}
主要问题的一部分是:
重载运算符&lt;所以一个国家不到 另一个状态当且仅当第一个状态的中心单元格中的值小于 第二个状态的中心单元格中的值。例如,
7 0 5 0 1 3
1 3 8 < 4 6 5
4 6 2 7 2 8
编写类驱动程序以测试重载的比较运算符。 提示:运营商&lt;函数必须是const,如下所示: bool运算符&lt;(State s)const
答案 0 :(得分:1)
您的operator<
无法满足Compare的要求,因为s < s
会返回true
。假设您的代码段中的q
是std::priority_queue<State>
,那么您的程序就会格式不正确。
你可能意味着拥有
bool State::operator<(const State & rhs)
{ return grid[1][1] < rhs.grid[1][1]; }
如果您希望队列的前面是最小元素,那么您应该将其定义为std::priority_queue<State, std::vector<State>, std::greater<State>>
,并定义
bool State::operator>(const State & rhs)
{ return grid[1][1] > rhs.grid[1][1]; }
而不是具有倒置的含义<