第一范文网 - 专业文章范例文档资料分享平台

8数码问题

来源:用户分享 时间:2025/5/29 9:10:20 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

入到open表中;

⑤把当前结点从open表中移除;

End while

End if 输出结果;

End

算法流程如下: 开始 读入棋局初始状态 否 是否可解 是 初始状态加入open表 在 open表中找到评价值最小的节点,作为当前结点 是 是目标节点 否 扩展新状态,把不重复的新状态加入open表中 当前结点从open表移除 输出结果 结束

3.使用的软件以及编程语言

实验环境:硬件环境:PC机。

软件环境:Windows 7 ;VC++ 6.0。

编程语言:C++语言。

4.实验结果

系统输入以及运行结果如下:

(1)初始状态是2 8 3 1 0 4 7 6 5,用h作为启发函数结果都如下:

(2)初始状态是2 0 3 1 8 4 7 6 5,用h作为启发函数结果都如下:

5.部分重要源程序

static int target[9]={1,2,3,8,0,4,7,6,5}; 全局静态变量,表示目标状态

class eight_num { private:

int num[9]; 定义八数码的初始状态

int not_in_position_num; 定义不在正确位置八数码的个数 int deapth; 定义了搜索的深度

int eva_function; 评价函数的值,每次选取最小的进行扩展

public: 数

eight_num(int init_num[9]);

eight_num(int num1,int num2,int num3,int num4,int num5,int num6,int num7,int num8,int num9){} eight_num(void){ } 计算启发函数g(n)的值

void eight_num::cul_para(void){} 显示当前节点的状态 void eight_num::show(){} 复制当前节点状态到一个另数组中

void eight_num::get_numbers_to(int other_num[9]){} 设置当前节点状态(欲设置的状态记录的other数组中) void eight_num::set_num(int other_num[9]){}

eight_num& eight_num::operator=(eight_num& another_8num){} eight_num& eight_num::operator=(int other_num[9]){} int eight_num::operator==(eight_num& another_8num){} int eight_num::operator==(int other_num[9]){} 空格向上移

eight_num* parent; 指向节点的父节点 eight_num* leaf_next; 指向open表的下一个节点

eight_num* leaf_pre; 指向open 表的前一个节点初始状态的构造函

int move_up(int num[9]){} 空格向下移

int move_down(int num[9]){} 空格向左移

int move_left(int num[9]){} 空格向右移

int move_right(int num[9]){} 判断可否解出

int icansolve(int num[9],int target[9]){} 判断有无重复

int existed(int num[9],eight_num *where){} 寻找估价函数最小的叶子节点

eight_num* find_OK_leaf(eight_num* start){} }

//计算启发函数g(n)的值 void eight_num::cul_para(void) { }

int i;

int temp_nipn=0; for (i=0;i<9;i++)

if (num[i]!=target[i])

temp_nipn++;

not_in_position_num=temp_nipn; if (this->parent==NULL)

deapth=0;

else

deapth=this->parent->deapth+1;

eva_function=not_in_position_num+deapth;

//空格向上移

int move_up(int num[9]) { }

//寻找估价函数最小的叶子节点

eight_num* find_OK_leaf(eight_num* start) { }

eight_num *p,*OK; p=OK=start;

int min=start->get_evafun(); for(p=start;p!=NULL;p=p->leaf_next)

if(min>p->get_evafun()) { }

OK=p;

min=p->get_evafun();

for (int i=0;i<9;i++)

if (num[i]==0)

break;

if (i<3)

return 0;

else { }

num[i]=num[i-3]; num[i-3]=0; return 1;

return OK;

搜索更多关于: 8数码问题 的文档
8数码问题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c4gqtn1z3n52mdyx42w9y_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top