人工智能用A*解决八数码问题,代码遇到了死循环,求解救
#include<iostream>
#include<vector>
using namespace std;
int start_state[3][3]={1,3,4,7,8,5,2,0,6};
int end_state[3][3]={1,2,3,4,5,6,7,8,0};
class Pnode
{
public:
int state[3][3];
int f_value;
int g_value;
int h_value;
Pnode* parent;
Pnode()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
state[i][j]=0;
}
}
f_value=0;
g_value=0;
h_value=0;
parent=NULL;
}
};
vector<Pnode> OPEN,CLOSE;
int call_difference( Pnode node)
{
int count=0;
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(node.state[i][j]!=end_state[i][j])
count++;
}
}
return count;
}
bool equal (Pnode a ,Pnode* b)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(a.state[i][j]!=b->state[i][j])
return false;
}
}
return true;
}
bool equal (Pnode a ,Pnode b)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(a.state[i][j]!=b.state[i][j])
return false;
}
}
return true;
}
void out_put(Pnode node)
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<node.state[i][j]<<" ";
}
cout<<endl;
}
}
bool in_list( vector<Pnode> list,Pnode node,Pnode &return_node,int &pos)
{
pos=0;
for(vector<Pnode>::iterator go=list.begin ();go!=list.end();go++,pos++)
{
if(equal(node,*go))
{ return_node=node;
return true;
}
}
return false;
}
void set_state(Pnode &node,int new_state[3][3])
{
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
node. state[i][j]=new_state[i][j];
}
}
}
bool exist(Pnode node,Pnode* father)
{
while(father!=NULL)
{
if(equal(node,father) ) return true;
father=father->parent;
}
return false;
}
void add_node(vector<Pnode>&head,Pnode node)
{
if(head.empty()) head.push_back(node);
else
{
vector<Pnode>::iterator go;
for(go=head.begin();go!=head.end();go++)
{
if(node.f_value<(*go).f_value) break;
}
head.insert(go,node);
}
}
int main()
{
Pnode Start,End;
int xpos,ypos,list_pos;
int i,j;
set_state(Start,start_state);
Start.h_value=call_difference(Start);
set_state(End,end_state);
OPEN.push_back(Start);
//add_node(OPEN,Start);
while(!OPEN.empty())
{
Pnode temp;
Pnode same_node,new_node;
vector<Pnode>list;
//get the first node of open
temp=*(OPEN.begin());
OPEN.erase(OPEN.begin());
add_node(CLOSE,temp);
cout<<"********"<<endl;
out_put(temp);
cout<<temp.g_value<<endl;
cout<<"********"<<endl;
if(equal(temp,End))
{
cout<<"finish "<<endl;
break;
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(temp.state[i][j]==0)
{
xpos=i;
ypos=j;
break;
}
}
}
if(xpos!=2)// space can be move to down
{
set_state(new_node,temp.state);
new_node.state[xpos+1][ypos]=0;
new_node.state[xpos][ypos]=temp.state[xpos+1][ypos];
if(!exist(new_node,temp.parent))
list.push_back(new_node);
}
if(xpos!=0)// space can be move to up
{
set_state(new_node,temp.state);
new_node.state[xpos-1][ypos]=0;
new_node.state[xpos][ypos]=temp.state[xpos-1][ypos];
if(!exist(new_node,temp.parent))
list.push_back(new_node);
}
if(ypos!=2)// space can be move to right
{
set_state(new_node,temp.state);
new_node.state[xpos][ypos+1]=0;
new_node.state[xpos][ypos]=temp.state[xpos][ypos+1];
if(!exist(new_node,temp.parent))
list.push_back(new_node);
}
if(ypos!=0)// space can be move to left
{
set_state(new_node,temp.state);
new_node.state[xpos][ypos-1]=0;
new_node.state[xpos][ypos]=temp.state[xpos][ypos-1];
if(!exist(new_node,temp.parent))
list.push_back(new_node);
}
for(vector<Pnode>::iterator go=list.begin();go!=list.end();go++)
{
new_node=*go;
new_node.g_value=temp.g_value+1;
new_node.h_value=call_difference(new_node);
new_node.f_value=new_node.g_value+new_node.h_value;
new_node.parent=&temp;
if(in_list(OPEN,new_node,same_node,list_pos))
{
if(new_node.g_value<same_node.g_value)
{
same_node.parent=&temp;
same_node.g_value=new_node.g_value;
same_node.f_value=new_node.f_value;
same_node.h_value=new_node.h_value;
}
OPEN.erase(OPEN.begin()+list_pos);
}
else if(in_list(CLOSE,new_node,same_node,list_pos))
{
if(new_node.g_value<same_node.g_value)
{
same_node.parent=&temp;
same_node.g_value=new_node.g_value;
same_node.f_value=new_node.f_value;
same_node.h_value=new_node.h_value;
}
CLOSE.erase(CLOSE.begin()+list_pos);
add_node(OPEN,same_node);
}
else
add_node(OPEN,new_node);
}
}
}