八数码宽度优先搜索
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*程序利用C++程序设计语言,在VC6.0下采用宽度优先的搜索方式,
成功的解决了八数码问题。程序中把OPEN表和CLOSED表用队列的方式存储,
大大地提高了效率,开始的时候要输入目标状态和起始状态,由于在宽度优先搜索的情况下,搜索过程中所走过的状态是不确定且很庞大的,所以程序
最后输出宽度优先情况下最少步数的搜索过程以及程序运行所需要的时间*/
#include "iostream"
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#include "string.h"
#include
#include
using namespace std;
constint N = 3;//3*3图
enum Direction{None,Up,Down,Left,Right};//方向
staticint n=0;
staticint c=0;
struct Map//图
{
int cell[N][N];//数码数组
Direction BelockDirec;//所屏蔽方向
struct Map * Parent;//父节点
};
//打印图
voidPrintMap(struct Map *map)
{
cout<<"*************************************************"< for(int i=0;i { for(int j=0;j { cout< } cout< } cout<<"*************************************************"< } //移动图 struct Map * MoveMap(struct Map * map,DirectionDirect,boolCreateNewMap) { struct Map * NewMap; //获取空闲格位置inti,j; for(i = 0; i < N; i++) { boolHasGetBlankCell = false; for(j = 0; j < N; j++) { if(map->cell[i][j] == 0) { HasGetBlankCell = true; break; } } if(HasGetBlankCell) break; } //移动数字 intt_i = i,t_j = j; boolAbleMove = true; switch(Direct) { case Down: t_i++; if(t_i>= N) AbleMove=false; break; case Up: t_i--; if(t_i< 0) AbleMove=false; break; case Left: t_j--; if(t_j< 0) AbleMove=false; break; case Right: t_j++; if(t_j>= N) AbleMove=false; break; }; if(!AbleMove)//不可以移动则返回原节点 { return map; } if(CreateNewMap) { NewMap = new Map(); for(int x = 0; x < N; x++) for(int y = 0; y < N; y++) NewMap->cell[x][y] = map->cell[x][y]; } else NewMap = map; NewMap->cell[i][j] = NewMap->cell[t_i][t_j]; NewMap->cell[t_i][t_j] = 0; returnNewMap; } boolIsSuccess(struct Map * map,struct Map * Target) { boolIsSuc = true; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(map->cell[i][j] != Target->cell[i][j]) { IsSuc = false; break; } } if(!IsSuc) break; } returnIsSuc; } struct Map * BNF_Search(struct Map * begin,struct Map * Target) { struct Map * p1, *p2, *p=NULL; boolIsSucc = false; queue