如何在C ++中使用广度优先搜索解决8难题问题

时间:2019-05-18 19:02:01

标签: c++ breadth-first-search 8-puzzle

我想构建一个使用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

1 个答案:

答案 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

您如何生成新状态?您从现有状态开始,然后尝试对其进行所有有效的移动。重复直到完成。