//
// main.cpp
// chongpai9_ai
//
// Created by 孙文睿 on 2018/11/12.
// Copyright © 2018 孙文睿. All rights reserved.
//
/******************************************************************************
* 使用深度优先、广度优先和A*算法解决九宫问题
******************************************************************************/
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include"data.h"
#include"queue.h"
#include"stack.h"
#include"link.h"
#define DEEPSEARCH 1
#define WIDESEARCH 2
#define ASTART 3
#define SEARCHTYPE ASTART //定义使用广度优先
//#define SHOWPROCESS //定义是否显示中间搜索过程
class SearchTree{
private:
/***********************定义open表的数据类型************************/
#if SEARCHTYPE==WIDESEARCH
Queue open;
#elif SEARCHTYPE==DEEPSEARCH
Stack open;
#else
Link open;
#endif
Stack close;
public:
void init(); //初始化数据
void extend(); //扩展close表尾节点并添加进open表
void moveToClose(); //将open表的头节点移动到close表中
bool success(); //判断搜索是否成功
bool openEmpty(); //判断open表是否为空
void showAnswer(); //显示最终结果
};
void SearchTree::showAnswer(){
close.show();
}
bool SearchTree::openEmpty(){
return open.empty();
}
void SearchTree::extend(){
DATATYPE temp[LINE][ROW],buf[LINE][ROW];
Data *pid;
int n,m;
pid=close.getTop(*buf); //将close表的最后一项记录复制到buf中
for(n=0;n<LINE;n++)
for(m=0;m<ROW;m++)
if(buf[n][m]==0)//寻找buf中0所在的位置,0表示空格
goto L1;
L1:
memcpy(temp,buf,DATASIZE*sizeof(DATATYPE));
if(n!=0){ //空格上移
temp[n][m]=temp[n-1][m];
temp[n-1][m]=0;
if(close.exist(*temp)==false) open.push(*temp,&pid);
#ifdef SHOWPROCESS //宏定义,决定时候输出中间过程
std::cout<<"move below data to open table:"<<std::endl;
showElement(*temp);
getchar();
#endif
}
memcpy(temp,buf,DATASIZE*sizeof(DATATYPE));
if(n!=2){ //空格下移
temp[n][m]=temp[n+1][m];
temp[n+1][m]=0;
if(close.exist(*temp)==false) open.push(*temp,&pid);
#ifdef SHOWPROCESS
std::cout<<"move below data to open table:"<<std::endl;
showElement(*temp);
getchar();
#endif
}
memcpy(temp,buf,DATASIZE*sizeof(DATATYPE));
if(m!=0){ //空格左移
temp[n][m]=temp[n][m-1];
temp[n][m-1]=0;
if(close.exist(*temp)==false) open.push(*temp,&pid);
#ifdef SHOWPROCESS
std::cout<<"move below data to open table:"<<std::endl;
showElement(*temp);
getchar();
#endif
}
memcpy(temp,buf,DATASIZE*sizeof(DATATYPE));
if(m!=2){ //空格右移
temp[n][m]=temp[n][m+1];
temp[n][m+1]=0;
if(close.exist(*temp)==false) open.push(*temp,&pid);
#ifdef SHOWPROCESS
std::cout<<"move below data to open table:"<<std::endl;
showElement(*temp);
getchar();
#endif
}
}
void SearchTree::moveToClose(){
DATATYPE dt[DATASIZE];
Data *pid;
open.pop(dt,&pid);
close.push(dt,&pid);
}
bool SearchTree::success(){
DATATYPE dt[DATASIZE];
close.getTop(dt);
return memcmp(dt,*sg,DATASIZE*sizeof(DATATYPE))? false:true;
}
void SearchTree::init(){
open.init();
close.init();
int i,j;
char a;
//初始节点s0
std::cout<<"请输入初始状态(0代表空格):"<<std::endl;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
std::cin>>a;
if('0'<=a && a<='9')
s0[i][j]=a-'0';
else
s0[i][j]=0;
}
}
//目标节点sg
std::cout<<"请输入目标状态(0代表空格):"<<std::endl;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
std::cin>>a;
if('0'<=a && a<='9')
sg[i][j]=a-'0';
else
sg[i][j]=0;
}
}
std::cout<<"初始状态为:";
showElement(*s0);
std::cout<<"目标状态为:";
showElement(*sg);
// std::cout<<"any key to continue"<<std::endl;
getchar();
open.push(*s0,NULL);
#ifdef SHOWPROCESS
std::cout<<"below data move to open table:"<<std::endl;
showElement(*s0);
#endif
}
int main(){
#if SEARCHTYPE==WIDESEARCH
puts("wide search");
#elif SEARCHTYPE==DEEPSEARCH
puts("deep search");
#else
puts("astart search");
#endif
SearchTree st;
st.init();
while(1){
//open表为空,问题无解
if(st.openEmpty()==true){
std::cout<<"there is no answer for this question, open table is empty"<<std::endl;
exit(0);
}
//将open表的表头移动到close表中
st.moveToClose();
//判断是否搜索成功
if(st.success()==true){
std::cout<<"get answer:"<<std::endl;
st.showAnswer();
exit(0);
}
//扩展close表
st.extend();
}
}
ベラー
- 粉丝: 0
- 资源: 1
最新资源
- python mne库学习-利用机器学习算法判断睡眠类型
- 进制转换计算机基础知识点
- TongWeb V7.0 集群管理指南
- 机械毕设,用mfc基于opencv库开发的能够识别活塞环外观掉角、划痕的缺陷.(含源码、文档)\活塞环外观表面缺陷检测
- TongWeb-V8.0产品介绍手册
- 韩国女主播视频网站+pc版+手机版本+可封装APP运营 帝国CMS7.5内核
- 采用opencv , c++ mfc来实现摄像头手动对焦, 每检测一个记录-2025
- TongWeb-V8.0安装与使用指引
- JAVA 程序设计试卷
- STM32HAL库的USB虚拟串口(VPC、CDC)配置及数据传输,USB复位及自动重连的解决方案
- 前端开发:JavaScript性能优化全解析-代码、内存、异步与网络优化技巧
- C++、MFC对话框程序编写的一个九宫格拼图程序-2025
- Java期末复习题编程题(47道)和选择题(30道) 包括异常处理和接口以及普通编程题
- 一个用 JavaScript 编写的音乐播放器,通过 HTML5 的 audio 标签实现基本播放功能,JavaScript 代码控制播放、暂停、下一首和上一首操作
- TongWeb-V8.0控制台使用手册
- JAVA题库习题及答案--.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈