用到A* 算法。还有h方程。定义如代码里面。
我的代码如下: 8puzzle.h:#include<iostream> #include<fstream> #include<list> #include<list> #include<map> #include<string> #include<sstream> #include<math.h> #include<algorithm> using namespace std; void begin(); int** input(); int** goal(); class state { public: state(int bd[3][3],state *prnt=NULL); state& operator=(const state& other); ~state(); void print(); state* getparent(); void setparent(state* prnt); void setg(int a); int getg(); int board[3][3]; void seth(int a); int geth(); void setf(); int getf(); state& operator=(state& other); state *parent; private: int g,h,f; }; int h1function (state &s, state &s1); int h2function (state &s, state &s2); bool lesssecond (state *s1, state *s2); string transform (state* s); state* up(state* s,int row, int column); state* down(state* s,int row, int column); state* right(state* s,int row, int column); state* left(state* s,int row, int column);
8puzzle.cpp
#include<iostream> #include<fstream> #include<list> #include<algorithm> #include<list> #include<map> #include<sstream> #include<string> #include<math.h> #include <stdlib.h> #include"8puzzle.h" using namespace std; void begin() { cout<<"Goal State:"<<endl; cout<<"1"<<"\t"<<"2"<<"\t"<<"3"<<"\t"<<endl; cout<<"8"<<"\t"<<" "<<"\t"<<"4"<<"\t"<<endl; cout<<"7"<<"\t"<<"6"<<"\t"<<"5"<<"\t"<<endl; cout<<"Initial State (Input):"<<endl; } int** input() { int a[9]; for(int j=0;j<9;j++) { cin>>a[j]; } for(int k=0;k<9;k++) { if(k%3==0) { if(a[k]==0) { cout<<endl<<" "<<"\t"; continue;} else { cout<<endl<<a[k]<<"\t"; continue;} } if(a[k]==0) { cout<<" "<<"\t"; continue;} else { cout<<a[k]<<"\t"; continue;} } cout<<endl; int **bd; bd=new int*[3]; for(int i=0;i<3;i++) bd[i]=new int[3]; bd[0][0]=a[0]; bd[0][1]=a[1]; bd[0][2]=a[2]; bd[1][0]=a[3]; bd[1][1]=a[4]; bd[1][2]=a[5]; bd[2][0]=a[6]; bd[2][1]=a[7]; bd[2][2]=a[8]; return bd; } int** goal() { int **bd; bd=new int*[3];