我想构建一个使用BFS解决8难题的c ++程序。 我想显示每个生成的状态。 但是问题是,我不知道如何生成状态。 我只希望有一些干净的函数可以有效地生成状态,并且有一个Explored数组可以确保没有冗余状态。
我已经研究过GitHub,但是解决方案太多了
到目前为止,我已经编写了以下代码
#include<iostream>
#include<conio.h>
using namespace std;
class puzzle{
private:
int initial[3][3],goal[3][3] = {{1,2,3},{4,5,6},{7,8,0}};
int queue[1000];
string data;
public:
void genratePuzzle();
void showState();
bool check_goal(int initial);
};
void puzzle::genratePuzzle(){
cout<<"\n***Create initial state 0-8***\n";
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cout<<"Insert at ["<<i<<"]["<<j<<"] : ";
cin>>initial[i][j];
}
}
}
void puzzle::showState(){
cout<<"\n***State***\n";
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
cout<<initial[i][j]<<" ";
}
cout<<endl;
}
}
bool puzzle::check_goal(int initial){
bool check = true;
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(initial[i][j] != goal[i][j]){
check = false;
}
}
}
return check;
}
int main(){
puzzle p1;
p1.genratePuzzle();
p1.showState();
getch();
}
目标状态
1 2 3
4 5 6
7 8 0
答案 0 :(得分:0)
将您的状态放入
private readonly FrameRate m_frameRate = new FrameRate();
public double FrameRate => m_frameRate.Current;
现在,您可以将struct state {
int data[3][3];
bool operator < (const state & other) {
for (int y=0; y<3; ++y) {
for (int x=0; x<3; ++x) {
if (data[y][x] < other.data[y][x]) {
return true;
}
if (data[y][x] > other.data[y][x]) {
return false;
}
}
}
return false; // all were equal
}
}
类型的值用作state
中的键,例如如有需要,请制作std::map
。它的行为就像一个由状态索引的数组,因此:
std::map<state, bool> explored
您如何生成新状态?您从现有状态开始,然后尝试对其进行所有有效的移动。重复直到完成。