资源简介
随机给定一个3×3的矩阵,其元素为8个不同的数码,起始状态为S0,目标状态为Sg,要求用两种或以上的方法设计优先队列式分支限界法,寻找从初始状态变换到目标状态的最优解,说明不同的优先选择策略变换到最终状态用了多少步,并对获得的结果做出比较分析。最终状态均如Sg表示。
代码片段和文件信息
#include
#include
#include
#include “fstream“
#include “iostream“
#include “iomanip“
using namespace std;
#define N 9
ifstream input(“input.txt“);
ofstream output(“ouput.txt“);
typedef struct
{
char pa[10];
char road[100];
} ENode;
ENode st;//开始状态
ENode f;//终止状态
ENode open[400000];//路径
bool closed[1000000000]={0};//保存已经走过的状态
int head=0tail=1len=400000;
long snum=1;
//函数声明
int canmove(ENode *uint rint cint iint n);
void count(int *int *ENode );
int empty(void);
void init(void);
void putintoclose(ENode);
int isaim(ENode);
void putintoopen(ENode);
ENode seach(int *);
ENode takeof(void);
int used(ENode );
void print(ENode mint t);
void move(ENode *uint int char ch);
long change(char s[]);
void main()
{
ENode m;
int t;
init(); //初始化
m=seach(&t); //搜索
print(mt); //输出路径
printf(“\n用closed长:%ld\n“snum);
}
void init(void) //
{
int i;
long u;
int c;
//从文件读入每个状态
for(i=0;i {
input>>c;
st.pa[i]=c+48;
}
printf(“初始状态%s\n“st.pa);
strcpy(f.pa“123804765“);
for(i=0;i<100;i++)
{
f.road[i]=‘\0‘;
st.road[i]=‘\0‘;
}
open[0]=st;
u=change(st.pa);
closed[u]=1; //
}
//将每个状态转换成一个整数,记录每个状态,方便判重
long change(char s[])
{
int i;
long m=0;
for(i=0;i<9;i++)
{
if(s[i]==‘0‘)
m=m*10;
else
m=m*10+(s[i]-‘0‘);
}
return m;
}
ENode seach(int *t) //
{
ENode m[4];
int r;//空格所在的行
int c;//空格所在的列
int inum=0;
//如果队列不空
while(!empty())
{
m[0]=m[1]=m[2]=m[3]=takeof();
num=strlen(m[0].road);//该节点已移动的次数
*t=num+1; //下一步
count(&r&cm[0]); //计算空位的位置
for(i=0;i<4;i++) //四个方向移动
{
if(canmove(&m[i]rcinum)) //判断是否能移动到该方向
{
if(isaim(m[i])) //如果是最终状态,则返回
return m[i];
if(!used(m[i])) //判重
{
putintoopen(m[i]); //放入队列
putintoclose(m[i]); //设置是否走过的标志
}
}
}
}
return m[0];
}
//判断队列是否为空
int empty(void)
{
if(head==tail)
{
printf(“栈空,无解“);
printf(“\nPress any key to continue“);
exit(0);
}
return 0;
}
//获取队首元素
ENode takeof(void)
{
ENode t;
t=open[head++];
head=head%len;
return t;
}
//计算空格所在位置
void count(int *rint *cENode u) //
{
int i;
for(i=0;i<10;i++)
if(u.pa[i]==‘0‘)
{
*r=i/3;*c=i%3;
break;
}
}
//判断是否可以扩展
int canmove(ENode *uint r
- 上一篇:C语言程序实习报告
- 下一篇:简单的编译器(c++实现)
相关资源
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
- VC++基于OpenGL模拟的一个3维空间模型
- c++ 虚拟摄像头
- hook,捕获所有案件,查找所有窗口,
- C语言课设计算器
- c++ 简易贪吃蛇源码
- 高精度加法(c++代码)
- C++调用百度地图案例
- 北京化工大学计算方法(C/C++)讲义
- 基于VC++的SolidWorks二次开发SolidWorks
- c++ 模拟鼠标按键
- OFD编辑器
- Beginning C++17 From Novice to Professional
- C++ STL实现
- opencv手部轮廓识别以及轨迹识别
- 百度C++编码规范
- C++ sql2008 WebServer通讯.docx
- c++ 定时关机程序源码
- 基于VSCode和CMake实现C++开发
- c++语法查询工具
- c++ 账务系统源码
- GBT 28169-2011 嵌入式软件 C语言编码规范
- c++ 猜拳小游戏
- XUnZip Zip解压缩.rar
评论
共有 条评论