




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include #include #include #include #include using namespace std;struct nodeint a33;int father;int gone;int fn;int x,y;int deep;vector store;int mx4=-1,0,1,0;int my4=0,-1,0,1;/ 存放矩阵/ 父节点的位置/ 是否遍历过 ,1为是 ,0 为否/ 评价函数的值/ 空格的坐标/ 节点深度/ 存放路径节点/ 上下左右移动数组bool check( int num) / 判断 storenum 节点与目标节点是否相同 ,目标节点储存
2、在 store0 中for (int i=0;i3;i+)for (int j=0;j3;j+)if (storenum.aij!=store0.aij)return false ;return true ;bool search( int num)/ 判断 storenum 节点是否已经扩展过 ,没有扩展返回 true/pre 指向 storenum 的父节点位置/ 循环直到 pre 为 0,既初始节点int pre=storenum.father;bool test= true ;while (!pre)for (int i=0;i3;i+)for (int j=0;j3;j+)if(st
3、orepre.aij!=storenum.aij)test= false ;break ;if (test= false ) break ;if(test= true ) return false ;/pre 继续指向 storepre 父节点位置pre=storepre.father;return true ;void print( int num)vector temp;int pre=storenum.father; temp.push_back(num);while (pre!=0)temp.push_back(pre);/ 打印路径 ,storenum 为目标节点/ 存放路径/ 从目
4、标节点回溯到初始节点pre=storepre.father;coutendl;cout数码移动步骤 *=0;m-)cout - 第 mm 步 - :endl;for (int i=0;i3;i+)for (int j=0;j3;j+)coutstoretempm.aijcoutendl;mm+;coutendl;cout 所需步数为 : storenum.deependl;return ;int get_fn( int num)/ 返回 storenum 的评价函数值int fn_temp=0;/ 评价函数值bool test= true ;for (int i=0;i3;i+)/ 当找到一个
5、值后 ,计算这个值位置与目标位置的距离差 ,test 置为 false 后继续寻找下一个值for (int j=0;j3;j+)test= true ;for (int k=0;k3;k+)for (int l=0;l3;l+)/ 寻值时if (storenum.x!=i|storenum.y!=j)&storenum.aij=store0.akl) 排除空格位fn_temp=fn_temp+abs(i-k)+abs(j-l);test= false ;if (test= false ) break ;if(test= false ) break ;fn_temp=fn_temp+storen
6、um.deep; / 加上节点深度return fn_temp;for (int i=0;i3;i+)for (int j=0;j3;j+)if (storenum.aij=0)storenum.x=i;storenum.y=j;intreturn ;main()cout A* 算法解决 8数码问题 endl;while (true )store.clear();/ 清空 storevector open;/ 建立 open 表int i,j,m,n,f;int temp;bool test;top=1;/ 当前节点在 store 的位置 ,初始节点在 store1int target9;in
7、t begin9;/ 储存初始状态和目标状态 ,用于判断奇偶int t1=0,t2=0;/ 初始状态和目标状态的奇偶序数node node_temp;store.push_back(node_temp);store.push_back(node_temp); / 用于创建 store0 和 store1, 以便下面使用cout 请输入初始数码棋盘状态 ,0 代表空格: endl; / 输入初始状态 ,储存在 store1test= false ;while (test= false )f=0;for (i=0;i3;i+)for (j=0;jtemp;beginf+=temp;test= tr
8、ue ;for (i=0;i8;i+) / 检查是否有重复输入 ,若有则重新输入for (j=i+1;j9;j+)if (begini=beginj)test= false ;break ;if(test= false ) break ;if (test= false ) cout 输入重复 ,请重新输入 :endl;kongxy(1); / 找出空格的坐标cout 请输入目标数码棋盘状态 ,0 代表空格: endl; / 输入目标状态 ,储存在 test= false ;while (test= false )f=0;for (i=0;i3;i+)for (j=0;jtemp;store0.
9、aij=temp;targetf+=temp;test= true ;for (i=0;i8;i+) / 检查是否有重复输入 ,若有则重新输入for (j=i+1;j9;j+)if (targeti=targetj)test= false ;break ;if(test= false ) break ;if (test= false )cout 输入重复 ,请重新输入 :endl;for (i=0;i9;i+) / 检查目标状态与初始状态是否匹配 test= false ;for (j=0;j9;j+)if (begini=targetj)test= true ;break ;if(test=
10、 false ) break ;if (test= false ) cout 输入与初始状态不匹配 ,请重新输入 : endl; for (i=1;i=0;j+)if(beginibegini-j)if (begini-j!=0) t1+;for (i=1;i=0;j+)if(targetitargeti-j)if (targeti-j!=0) t2+;if(!(t1%2=t2%2)cout 无法找到路径 .endl;coutendl;/system(pause);/return 0;continue ;LARGE_INTEGER Freg;LARGE_INTEGER Count1,Count
11、2;QueryPerformanceFrequency(&Freg);QueryPerformanceCounter(&Count1);double d;/ 获取时间 Count1store1.father=0;store1.gone=0;store1.deep=0;store1.fn=get_fn(1);/ 初始化参数/ 初始节点的父节点为 0if(check(1) / 判断初始状态与目标状态是否相同 print(1);/system(pause);/return 0;coutendl;continue ;while (!open.empty() / 当 open 表不为空时 ,开始寻找路径
12、if (check(top) break ;min=top;int i_min=0;for (i=0;iopen.size();i+)/遍历open表中元素,找岀store中fn值最小的节点if(storeopeni.fn=storemin.fn&storeopeni.gone=0)min=openi;i_min=i;storemin.gone=1;open.erase(open.begin()+i_min);/把最小节点标记遍历过 并从open表中删除m=storemin.x;n=storemin.y;/空格坐标for (f=0;f=0&i=0&j=2)top+;store.push_bac
13、k(storemin);storetop.father=min;storetop.gone=0;storetop.deep=storemin.deep+1;/ 当变换后的空格坐标在矩阵中时/ 把 storemin 压入 store 中成为新增节/ 新增节点的父节点为 min/ 新增节点未被访问/ 新增节点的深度为父节点深度temp=storetop.amn;storetop.amn=storetop.aij;storetop.aij=temp;storetop.x=i;storetop.y=j;storetop.fn=get_fn(top);open.push_back(top);if (check(top)print(top);/ 交换空格与相邻数字/ 移动后的空格坐标/ 移动后的 fn 值/把top压入open表中/ 检查是否到达目标/system(pause);/return 0;break ;if (search(top)= false ) / 检查新增节点是否被访问过 ,若访问过 ,则删 除此节点top-;store.pop_back();ope
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国海上光伏行业市场前景预测及投资价值评估分析报告
- 安全文明出行课件
- 土地租地合同协议书文库
- 天气创意课件图片
- 非遗项目商业计划书范文
- 文化墙安装合同协议书
- 安装学徒合同协议书模板
- 恋爱合同协议书抖音
- 音乐版权代理相关行业项目成效实现方案
- 天成贵龙文化课件模板
- 安徽兴欣新材料有限公司年产20000吨三丙酮胺、10000吨2,2,6,6-四甲基哌啶醇、6000吨哌啶胺、6000吨受阻胺光稳定剂及600Nm3h甲醇重整制氢项目环境影响报告书
- 国际公路货物运输合同公约cmr
- 史记年表·十二诸侯年表
- 普通高等学校本科专业设置申请表
- 多发性硬化康复
- 开封中学教师招聘2022年考试真题及答案解析二2
- GB/T 41837-2022温泉服务温泉水质要求
- RB/T 017-2019低碳产品评价方法与要求三相配电变压器
- JJG 30-2012通用卡尺
- GB/T 26785-2011细水雾灭火系统及部件通用技术条件
- 中药药理学题库(附上答案)
评论
0/150
提交评论