资源描述
人工智能课内实验报告
(8次)
学 院: 自动化学院
班 级: 智能1501
姓 名: 刘少鹏(34)
学 号:
目 录
课内实验1:猴子摘香蕉问题得VC编程实现……………………1
课内实验2:编程实现简单动物识别系统得知识表示………5
课内实验3:盲目搜索求解8数码问题………………………18
课内实验4:回溯算法求解四皇后问题………………………33
课内实验5:编程实现一字棋游戏……………………………37
课内实验6:字句集消解实验…………………………………46
课内实验7:简单动物识别系统得产生式推理………………66
课内实验8:编程实现D-S证据推理算法……………………78
人工智能课内实验报告
实验1:猴子摘香蕉问题得VC编程实现
学 院: 自动化学院
班 级: 智能1501
姓 名: 刘少鹏 (33)
学 号: 06153034
日 期: 2017—3—8 10:15-12:00
实验1:猴子摘香蕉问题得VC编程实现
一、 实验目得
(1)熟悉谓词逻辑表示法;
(2)掌握人工智能谓词逻辑中得经典例子—-猴子摘香蕉问题得编程实现.
二、编程环境
VC语言
三、 问题描述
房子里有一只猴子(即机器人),位于a处。在c处上方得天花板上有一串香蕉,猴子想吃,但摘不到。房间得b处还有一个箱子,如果猴子站到箱子上,就可以摸着天花板。如图1所示,对于上述问题,可以通过谓词逻辑表示法来描述知识。要求通过VC语言编程实现猴子摘香蕉问题得求解过程。
图1 猴子摘香蕉问题
四、 源代码
#include〈stdio、h〉
unsigned int i;
void Monkey_Go_Box(unsigned char x, unsigned char y)
{
ﻩ printf("Step %d:monkey从%c走到%c\n", ++i, x, y);//x表示猴子得位置,y为箱子得位置
}
void Monkey_Move_Box(char x, char y)
{
printf("Step %d:monkey把箱子从%c运到%c\n", ++i, x, y);//x表示箱子得位置,y为香蕉得位置
}
void Monkey_On_Box()
{
printf(”Step %d:monkey爬上箱子\n", ++i);
}
void Monkey_Get_Banana()
{
printf(”Step %d:monkey摘到香蕉\n", ++i);
}
void main()
{
ﻩ unsigned char Monkey, Box, Banana;
ﻩ printf(”********智能1501班**********\n");
printf(”********06153034************\n”);
ﻩ printf(”********刘少鹏**************\n");
ﻩ printf("请用a b c来表示猴子箱子香蕉得位置\n");
ﻩ printf(”Monkey\tbox\tbanana\n”);
scanf(”%c”, &Monkey);
ﻩ getchar();
ﻩ printf(”\t”);
scanf(”%c", &Box);
getchar();
ﻩ printf("\t\t");
ﻩ scanf("%c”, &Banana);
getchar();
printf("\n操作步骤如下\n”);
ﻩ if (Monkey != Box)
{
ﻩ Monkey_Go_Box(Monkey, Box);
}
if (Box != Banana)
ﻩ {
ﻩ Monkey_Move_Box(Box, Banana);
ﻩ }
Monkey_On_Box();
ﻩ Monkey_Get_Banana();
printf(”\n");
ﻩ getchar();
}
五、 实验结果相关截图
六、心得体会
通过本次实验,我初步了学会了使用VC得新建工程,并且进行简单得程序编写。此外我还学会如何使用一些谓词来解决生活中得一些简单问题,并且用VC编程给出具体得操作步骤,感觉对VC编程有了新得认识。在实验中我也遇到过许多问题,比如在我写完代码进行编译时总就是会出现一个错误“ fatal error C1010: 在查找预编译头时遇到意外得文件结尾,就是否忘记了向源中添加“#include ‘stdafx、h’”关于这个错误我我问了几个同学得不出答案后,我决定通过上网查找,最终找到了解决方法,需要在该项目得每一个cpp结尾得文件属性中设置不使用预编译头即可。在这个过程中也锻炼了自己解决问题得能力。
人工智能课内实验报告
实验2:编程实现简单动物识别系统得知识表示
学 院: 自动化学院
班 级: 智能1501
姓 名: 刘少鹏(33)
学 号: 06153034
日 期: 2017-3—13 10:15—12:00
实验2:编程实现简单动物识别系统得知识表示
一、实验目得
1、理解与掌握产生式知识表示方法;
2、能够通过VC编程语言实现产生式系统得规则库。
二、实验内容
1、以动物识别系统得产生式规则为例;
2、用选定得编程语言建造规则库与综合数据库,并能对它们进行增加、删除与修改操作.
三、 实验步骤
1、 确定需要识别得动物及其属性
本次实验得简单动物识别系统总共能识别7种动物,即:老虎、金钱豹、斑马、长颈鹿、企鹅、鸵鸟与信天翁。
2、 建立识别七种动物识别系统得规则
3、 选定编程语言并确定综合数据库与规则库结构
(1) 选用C语言作为编程语言
(2)综合数据库得建立
(3)规则库得建立
四、程序源代码
#include 〈iostream〉
#include <string>
using namespace std;
struct RULESﻩﻩ ﻩ
{
int count;
ﻩ char pre[255];
ﻩ char back[255];
int mark;
};
void check();
RULES r[100] = {
ﻩ { 1,”有毛发","哺乳动物",0 }, ﻩ //所有规则静态数据库
ﻩ { 1,”有奶",”哺乳动物",0 },
ﻩ { 1,"有羽毛”,”鸟",0 },
ﻩ { 2,”会飞&下蛋&","鸟",0 },
{ 1,”吃肉","食肉动物”,0 },
ﻩ { 3,”有锋利得牙齿&有爪&眼睛盯着前方&”,"食肉动物”,0 },
ﻩ { 2,"哺乳动物&有蹄&”,”有蹄类哺乳动物”,0 },
ﻩ { 2,”哺乳动物&反刍&”,”有偶蹄类哺乳动物”,0 },
ﻩ { 4,”哺乳动物&食肉动物&黄褐色&有暗斑&",”金钱豹",0 },
{ 4,"哺乳动物&食肉动物&黄褐色&黑色条纹&”,"老虎”,0 },
{ 4,"有蹄类哺乳动物&有长脖子&有长腿&有暗斑&","长颈鹿",0 },
ﻩ { 2,”有蹄类哺乳动物&黑条纹&","斑马",0 },
{ 5,"鸟&不会飞&有长脖子&有长腿&黑白色&","鸵鸟",0 },
ﻩ { 4,"鸟&不会飞&会游泳&黑白色&",”企鹅”,0 },
{ 2,"鸟&会飞&","信天翁”,0 },
ﻩ { 1,”反刍","哺乳动物",0 }
};
int number;
int m;
int cat = 15;
int a;
int length;ﻩﻩ ﻩ //输入得事实长度
string f[255]; ﻩﻩﻩ//输入得事实数组
void input()
{
while (1)
{
ﻩ cat++;
cout 〈〈 ”number" <〈 endl;
ﻩ cin 〉> r[cat]、count;
cout 〈< "输入事实,两种以上得事实请在每个事实后加上‘&’符号" 〈< endl;
cin 〉> r[cat]、pre;
ﻩ cout 〈< ”输入结果” 〈〈 endl;
cin >〉 r[cat]、back;
ﻩﻩ r[cat]、mark = 0;
ﻩﻩ while (1)
ﻩ {
ﻩﻩ cout << ”输入“1"继续添加规则,输入“2”查瞧规则库" 〈< endl;
ﻩﻩﻩint p;
ﻩcin 〉> p;
ﻩﻩif (p == 1)
ﻩﻩ {
ﻩ ﻩ input();
ﻩﻩﻩ}
ﻩ else
ﻩﻩﻩ{
ﻩ if (p == 2)
ﻩﻩ {
ﻩﻩ ﻩ check();
ﻩ }
ﻩ ﻩﻩelse
ﻩ ﻩ {
ﻩ ﻩcout <〈 "输入错误,重新输入" 〈〈 endl;
ﻩﻩﻩﻩ}
ﻩﻩﻩ }
ﻩ }
}
}
void delate()
{
cout 〈< "输入要删除得条数" 〈< endl;
ﻩ int bar;
ﻩ cin >> bar;
for (int t = 0; t 〈= cat; t++)
ﻩ {
ﻩ r[bar — 1] = r[bar];
bar++;
}
ﻩ cat——;
ﻩ check();
}
void check()
{
cout 〈< endl <〈 ”规则库如下” 〈< endl;
for (int i = 0; i 〈= cat; i++)
ﻩ {
cout << i + 1 << ”、” << "由" 〈〈 r[i]、pre 〈< ”可得" 〈< r[i]、back <〈 endl;
}
ﻩ cout << endl;
ﻩ while (1)
{
cout <〈 ”输入“1”继续添加规则,输入“3”删除选定得规则" <〈 endl;
ﻩ cin >> m;
ﻩﻩ if (m == 1)
ﻩ {
ﻩ input();
}
ﻩﻩ else
ﻩ {
ﻩ if (m == 3)
ﻩ ﻩdelate();
}
ﻩ }
}
int find_rule(int s) ﻩ//查找规则库中就是否还有可使用得规则
{
ﻩfor (int i = 0; i <= 15; i++)
ﻩﻩs = s*r[i]、mark;
//cout<〈”find_rule结果”<<s<<endl;
ﻩreturn s;
}
int pare1(RULES r) //当前提条件为1时
{
int j = 0, i = 1;
string str, str2;
str = r、pre;
while (i 〈= length)
ﻩ{
ﻩ if (f[i] == str)
ﻩ {
ﻩ str2 = r、back;
f[length + 1] = str2;ﻩ //加入事实库
ﻩﻩﻩlength++; ﻩ //事实库得长度加1
ﻩ ﻩr、mark = 1; ﻩﻩ//标记规则已使用过
ﻩﻩ break;
ﻩ}
else
ﻩ ﻩi++;
}
ﻩreturn r、mark;
}
int pare2(RULES r) ﻩ//前提条件不为1
{
string b[10];
string str, str2;
ﻩint i, j = 1, num = 0;
ﻩint a = 0;
str = r、pre;
ﻩfor (i = 0; i != 10; ++i) //转换数组
ﻩ{
b[i] = ”";
}
ﻩfor (i = 0; i != str、length(); ++i)
ﻩ{
ﻩﻩif (str、at(i) != '&')
{
ﻩﻩﻩb[j] += str、at(i);
ﻩ}
ﻩﻩelse
ﻩ {
j++;
ﻩ }
ﻩ}
ﻩi = 1;
ﻩwhile (i <= r、count)
{
ﻩfor (j = 1; j != length + 1; j++)
ﻩ{
ﻩﻩ if (f[j] == b[i])
ﻩﻩﻩ{
ﻩ a += 1;
ﻩﻩﻩ}
ﻩ }
ﻩi++;
ﻩ}
ﻩif (a == r、count)
{
str2 = r、back;
ﻩﻩf[length + 1] = str2; ﻩ //加入事实库
ﻩ length++;ﻩ ﻩﻩ //事实库得长度加1
ﻩr、mark = 1; //标记规则已使用过
}
ﻩreturn r、mark;
}
void result()
{
ﻩint i = 1, m = 0;
while (i != length + 1)
{
ﻩﻩif (f[i] == ”金钱豹")
ﻩ{
ﻩ cout <〈 ”该动物就是金钱豹" <〈 endl;
ﻩ ﻩm = 1;
ﻩ ﻩbreak;
ﻩ }
ﻩ else
ﻩﻩif (f[i] == "老虎”)
ﻩﻩ{
ﻩ ﻩ cout 〈< "该动物就是老虎" 〈〈 endl;
ﻩﻩm = 1;
ﻩ ﻩﻩbreak;
ﻩ ﻩ}
ﻩ else
ﻩﻩﻩﻩif (f[i] == ”长颈鹿")
ﻩ {
ﻩ cout 〈< "该动物就是长颈鹿" <〈 endl;
ﻩﻩm = 1;
ﻩ ﻩbreak;
ﻩ }
ﻩﻩﻩelse
ﻩ ﻩ if (f[i] == "斑马”)
ﻩﻩ {
ﻩ ﻩcout << "该动物就是斑马" << endl;
ﻩﻩ ﻩ ﻩm = 1;
ﻩ break;
ﻩ ﻩ ﻩ}
ﻩﻩﻩﻩelse
ﻩ ﻩ if (f[i] == "鸵鸟")
ﻩﻩ ﻩﻩ {
ﻩ ﻩ ﻩcout 〈〈 "该动物就是鸵鸟" 〈〈 endl;
ﻩﻩﻩﻩ ﻩm = 1;
ﻩﻩ ﻩbreak;
ﻩﻩﻩﻩ }
ﻩﻩﻩ ﻩelse
ﻩﻩﻩ ﻩﻩﻩif (f[i] == ”企鹅")
ﻩ ﻩ ﻩﻩﻩ{
ﻩ ﻩ ﻩcout 〈〈 ”该动物就是企鹅" <〈 endl;
ﻩﻩﻩ m = 1;
ﻩﻩ ﻩ break;
ﻩ ﻩ ﻩﻩ}
ﻩﻩ ﻩﻩelse
ﻩﻩ ﻩﻩﻩ ﻩif (f[i] == "信天翁")
ﻩ ﻩﻩ ﻩﻩ {
ﻩ ﻩ ﻩ cout << "信天翁" 〈〈 endl;
ﻩﻩ ﻩﻩ ﻩm = 1;
ﻩﻩ ﻩﻩﻩ ﻩ break;
ﻩ ﻩ }
ﻩﻩﻩﻩﻩ else
ﻩ ﻩ ﻩ i++;
}
ﻩif (m == 0)
ﻩ cout << ”没有符合得动物,请确认特征,重新输入” << endl;
}
void idetify()
{
ﻩint i = 0, u = 0;
ﻩif (find_rule(u) == 0) //如果规则库中还有未使用得规则
ﻩ{//cout〈〈"还有未使用得规则"<<endl;
ﻩﻩint num = length;
ﻩﻩwhile (i〈16)ﻩﻩﻩﻩﻩ//从第一条规则开始遍历
{
ﻩﻩﻩif (r[i]、mark == 0)ﻩ ﻩ//如果该条规则未使用
ﻩ {
if (r[i]、count == 1) ﻩ //该条规则前提数为1
ﻩﻩﻩ {
ﻩﻩ u = pare1(r[i]);
ﻩ if (u == 1)
ﻩﻩﻩﻩﻩr[i]、mark = 1;
ﻩ ﻩ if (r[i]、mark == 1)
ﻩﻩﻩ{
ﻩ cout << ”使用规则" <〈 i + 1;
ﻩ ﻩcout 〈〈 ”且加入得新事实为” 〈〈 r[i]、back <〈 endl;
ﻩﻩﻩ }
ﻩ ﻩ }
ﻩ ﻩelse
ﻩ ﻩ{
ﻩﻩﻩ ﻩu = pare2(r[i]);
ﻩ ﻩﻩif (u == 1)
ﻩ ﻩﻩ r[i]、mark = 1;
if (r[i]、mark == 1)
ﻩﻩ ﻩ {
ﻩﻩﻩ cout << ”使用规则” << i + 1;
ﻩﻩ ﻩ cout 〈< "且加入得新事实为" <〈 r[i]、back 〈< endl;
ﻩﻩ }
ﻩ ﻩ }
ﻩ }
ﻩ if (i == 15)
ﻩ ﻩ{
ﻩﻩ if (num != length)
ﻩ{
ﻩ ﻩﻩﻩi = 0;
ﻩﻩﻩﻩﻩnum = length;
ﻩ}
ﻩ else
ﻩﻩﻩ i = 16;
ﻩ }
ﻩﻩ else
ﻩﻩ {
ﻩ i++;
ﻩ }
}
}
ﻩelse
ﻩ{
cout 〈〈 ”所有得规则都已使用” 〈〈 endl;
ﻩ}
ﻩresult();
}
/*主函数*/
void main()
{
ﻩcout <〈 "******智能1501班********” 〈〈 endl;
ﻩcout <〈 "******06153034**********” <〈 endl;
cout <〈 ”******刘少鹏************” << endl;
cout 〈< ”进行动物识别请输入7” 〈< endl;
cout 〈〈 ”进行规则库操作请输入8" << endl;
ﻩcin >〉 a;
ﻩwhile (a == 8)
{ while (1)
ﻩ {
ﻩﻩcout 〈〈 ”添加规则输入‘1’,查瞧已有规则输入‘2'” 〈〈 endl;
ﻩ cin >> m;
ﻩ if (m == 1)
ﻩ{
ﻩ input();
}
ﻩﻩelse
ﻩ {
ﻩﻩﻩif (m == 2)
ﻩ {
ﻩ check();
ﻩ ﻩ}
ﻩ ﻩ else
ﻩ ﻩcout 〈< ”输入错误请重新输入” 〈< endl;
ﻩ }
}
}
if (a == 7)
ﻩ{
int u = 0;
ﻩcout 〈< "请输入动物得特征数" <〈 endl;
ﻩ cin 〉〉 length;
ﻩ cout << "请输入动物得特征” 〈< endl;
ﻩfor (int i = 1; i 〈= length; i++)
ﻩ ﻩcin 〉〉 f[i];
ﻩ idetify();
}
ﻩsystem(”pause”);
}
五、 实验结果相关截图
1、程序总体结构
2、 规则库操作→查瞧规则库
3、 规则库操作→添加规则→添加袋鼠规则
4、 规则库操作→删除规则→删除袋鼠规则
5、动物识别→识别长颈鹿
六、心得体会
通过本次实验我深刻得理解与掌握产生式知识表示方法,并且能够通过VC编程语言实现产生式系统得规则库.本次实验我同样遇到许多问题,我通过自己查阅资料,与同学们讨论,逐步得将自己得问题解决,在这个过程中提高了我得问题解决能力。最后因为本次实验只有对数据库有清楚得掌握,同时熟悉规则才能合理编程,因此我在平时得学习中应当加大数据库与数据结构得学习力度,提高自己得编程能力。
人工智能课内实验报告
实验3:盲目搜索求解八数码问题
学 院: 自动化学院
班 级: 智能1501
姓 名: 刘少鹏 (33)
学 号: 06153034
日 期: 2017-03—30 10:15—12:00
人工智能课内实验3:盲目搜索求解8数码问题
1、 实验目得
(1) 熟悉人工智能系统中得问题求解过程;
(2) 熟悉状态空间中得盲目搜索策略;
(3) 掌握盲目搜索算法,重点就是宽度优先搜索与深度优先搜索算法.
2、 实验要求
用VC语言编程,采用宽度优先搜索与深度优先搜索方法,求解8数码问题
3、 实验内容
(1) 采用宽度优先算法,运行程序,要求输入初始状态
假设给定如下初始状态S0
2 8 3
1 6 4
7 0 5
与目标状态Sg
2 1 6
4 0 8
7 5 3
验证程序得输出结果,写出心得体会。
(2)对代码进行修改(选作),实现深度优先搜索求解该问题
提示:每次选扩展节点时,从数组得最后一个生成得节点开始找,找一个没有被扩展得节点。这样也需要对节点添加一个就是否被扩展过得标志。
4 源代码及实验结果截图
(1) 实验源代码
#include 〈stdlib、h〉
#include <stdio、h>
Typedef struct Node { int num[9]; //棋盘状态
int deepth; //派生得深度 g(n)
int diffnum; //不在位得数目 h(n)
int value; //耗散值 f(n)=g(n)+h(n)
struct Node * pre;
ﻩ struct Node * next;
struct Node * parent;
}numNode; /* -- end of struct numNode —— */
int origin[9]; //棋盘初始状态
int target[9]; //棋盘目标状态
int numNode_num, total_step;
numNode *open, *close; //Open表与Close表
numNode *create_numNode()
{
ﻩ return (numNode *)malloc(sizeof(numNode));
}
numNode *open_getfirst(numNode *head); //返回第一项,并从Open表中删除
void open_insert(numNode *head, numNode *item); //向Open表中按序插入新节点
void close_append(numNode *head, numNode *item); //向Close表中插入新节点
int expand(numNode *item); //扩展节点
int print_result(numNode *item); //打印结果
numNode *copy_numNode(numNode *orgin);
char isNewNode(numNode *open, numNode *close, int num[9]); //就是否在Open表或Close表中
void print_num(int num[9]); //打印棋盘状态
int diff(int num[9]); //求不在位棋子得个数
void init(); //初始化,获得棋盘初始状态与目标状态
void s *a, int *b);
int operate(int num[], int op);
void free_list(numNode *head);
//* Name: 主函數
//* Description: 程序入口
int main(int argc, char *argv[])
{
//初始化Open表与Close表
ﻩ printf(”*****智能1501****\n");
printf("*****刘少鹏******\n”);
ﻩ printf("*****06153034****\n”);
ﻩ open = create_numNode();
close = create_numNode();
ﻩ open-〉pre = open->next = close—>pre = close—〉next = NULL;
ﻩ init(); //由用户输入初始与目标状态
ﻩ ﻩ//初始化初始节点
ﻩ numNode *p1;
ﻩ p1 = create_numNode();
ﻩ p1-〉parent = NULL;
ﻩ p1—〉deepth = 0;
ﻩ int i = 0;
for (i = 0; i〈9; i++)
ﻩ {
ﻩﻩ p1—>num[i] = origin[i];
ﻩ }
open_insert(open, p1);
numNode_num = 1;
p1 = open_getfirst(open);
while (p1 != NULL)
{
ﻩﻩ close_append(close, p1);
ﻩ if (expand(p1))
ﻩreturn EXIT_SUCCESS;
p1 = open_getfirst(open);
}
ﻩ printf(”No solution!\n");
return EXIT_SUCCESS;
} /* -—----—--- end of function main -——--——--— */
void init()
{
while (1)
ﻩ{
printf(”Please input opriginal status:\nFor example:123456780 stands for\n"
ﻩ”1 2 3\n”
ﻩ ”4 5 6\n”
ﻩ ﻩ”7 8 0\n”);
ﻩchar temp[10];
ﻩﻩscanf(”%s", &temp);
int i = 0;
ﻩfor (i = 0; i〈9 && temp[i] - ’0’ 〉= 0 && temp[i] - '0’ 〈= 8; i++)
ﻩﻩ{
origin[i] = temp[i] - '0';
ﻩ }
printf("Please input target status:\n”);
ﻩscanf("%s", &temp);
ﻩﻩint j = 0;
ﻩﻩfor (j = 0; j〈9 && temp[j] - '0' 〉= 0 && temp[j] - '0' <= 8; j++)
ﻩ {
ﻩﻩtarget[j] = temp[j] — ’0’;
ﻩ}
ﻩsystem("cls");
if (i == 9 && j == 9)
{
ﻩ ﻩbreak;
}
}
} /* —--—— end of function init —-—-— */
void open_insert(numNode *head, numNode *item)
{
ﻩnumNode *p, *q;
ﻩp = head—>next;
q = head;
ﻩwhile (p != NULL && item—>value 〉 p-〉value)
{
ﻩﻩq = p;
ﻩp = p-〉next;
}
q—>next = item;
ﻩitem-〉pre = q;
ﻩitem->next = p;
if (p != NULL)
ﻩ{
ﻩﻩp—>pre = item;
ﻩ}
} /* —-—-— end of function open_insert —--—- */
numNode *open_getfirst(numNode *head)
{
ﻩnumNode *p;
ﻩif (head-〉next == NULL)
ﻩ{
ﻩreturn NULL;
ﻩ}
p = head—〉next;
ﻩhead->next = p->next;
if (p—〉next != NULL)
ﻩ{
ﻩ p—>next—〉pre = head;
}
p—〉pre = NULL;
p->next = NULL;
ﻩreturn p;
} /* -—-—— end of function open_getfirst -———— */
void close_append(numNode *head, numNode *item)
{
ﻩitem-〉next = head—〉next;
ﻩitem—>pre = head;
head-〉next = item;
ﻩif (item->next != NULL)
{
ﻩﻩitem->next—>pre = item;
ﻩ}
} /* ————- end of function close_append -—-—- */
int expand(numNode *p1)
{
numNode * p2;
int op = 1;
ﻩfor (op = 1; op <= 4; op++)
ﻩ{
p2 = copy_numNode(p1);
ﻩﻩoperate(p2—〉num, op);
if (isNewNode(open, close, p2-〉num) == ’N')
ﻩﻩ{
ﻩﻩﻩp2—〉parent = p1;
ﻩ p2->deepth = p1—>deepth + 1;
ﻩ ﻩp2-〉diffnum = diff(p2->num);
ﻩp2—〉value = p2—>deepth + p2—〉diffnum;
ﻩﻩﻩif (p2-〉diffnum == 0)
ﻩ{
total_step = print_result(p2);
ﻩ ﻩprintf("Total step: %d\n", total_step);
ﻩfree_list(open);
ﻩﻩ free_list(close);
ﻩ return 1;
ﻩ ﻩ}
ﻩﻩ else
ﻩﻩﻩ{
ﻩnumNode_num++;
open_insert(open, p2);
ﻩﻩ }
ﻩ}
ﻩ else
free(p2);
}
return 0;
} /* ——--— end of function expand -—-—- */
int operate(int m[], int op)
{
ﻩint blank;
blank = 0;
while (m[blank] != 0 && blank<9)
ﻩ ++blank;
if (blank == 9)
ﻩﻩreturn 1;
ﻩswitch (op) {
case 1: /* up */
ﻩif (blank〉2)
ﻩswap(m + blank, m + blank - 3);
break;
case 2: /* down */
ﻩﻩif (blank〈6)
ﻩﻩﻩswap(m + blank, m + blank + 3);
ﻩ break;
ﻩcase 3: /* left */
if (blank != 0 && blank != 3 && blank != 6)
ﻩ swap(m + blank, m + blank — 1);
ﻩbreak;
case 4: /* right */
if (blank != 2 && blank != 5 && blank != 8)
ﻩﻩﻩswap(m + blank, m + blank + 1);
ﻩ break;
default: return 1;
}
return 0;
}
void s *a, int *b)
{
int c;
c = *a;
*a = *b;
ﻩ*b = c;
}
numNode * copy_numNode(numNode *origin)
{
numNode *p;
ﻩp = create_numNode();
p—>deepth = origin—〉deepth;
p-〉diffnum = origin—>diffnum;
ﻩp-〉value = origin-〉value;
int i;
ﻩfor (i = 0; i<9; i++)
{
ﻩ (p->num)[i] = (origin->num)[i];
}
ﻩreturn p;
} /* -—-—— end of function copy_numNode ——--— */
int
diff(int num[9])
{
ﻩint i, diffnum = 0;
ﻩfor (i = 0; i〈9; i++)
ﻩif (num[i] != target[i])
ﻩ diffnum++;
return diffnum;
} /* ——--— end of function diff —--—- */
char
isNewNode(numNode *open, numNode *close, int num[
展开阅读全文