人工智能用A*解决八数码问题,代码遇到了死循环,求解救

highway4 2011-11-05 04:49:03
#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);

}
}
}




















...全文
199 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq120848369 2011-11-05
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 highway4 的回复:]

引用 1 楼 qq120848369 的回复:

可以去我博客里找找,我写过。
我是用A*写的哦,我遇到的是一个指针问题,我们思路不一样
[/Quote]

咦,我记得我博客有A*啊.
highway4 2011-11-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qq120848369 的回复:]

可以去我博客里找找,我写过。
[/Quote] 我是用A*写的哦,我遇到的是一个指针问题,我们思路不一样
qq120848369 2011-11-05
  • 打赏
  • 举报
回复
可以去我博客里找找,我写过。

65,204

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧