C语言实现8数码问题
人工智能实验报告大全
人工智能课实验报告
(8次)
学院:自动化学院
班级:智能1501
姓名:少鹏(34)
学号:06153034
目录
课实验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
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为箱子的位置}
十五数码问题研究及实现
十五 数 码 问 题 的 解 空 间树 属 排列 树 .用 于排 列 树搜 索 的方
法 主 要 有 两 大 类 一 类 是 盲 目搜 索 . 深 度 优 先 搜 索 D 和 广 : 如
如 图 1 在 一 个 4 4的 正 方 形 上 放 人 数 字 12 … … .5 剩 , x ,。 1, 余 一 格 为 空 格 。 临 近空 格 的数 码 可
21 0 0年第 2期
福
建 电
脑
7 3
十五 数 码 问题 研 究 及 实 现
闵文杰
f 庆 交 通 大 学 重 庆 重
【 摘
要 】 十 五 数 码 J题 是 人 工 智 能 领 域 中的 一 个 典 型 问 题 。 本 文 对 该 问题 进 行 了详 细 分 析 , 用启 发 式 搜 索 解 决 了 : ; - I 并
的移 动 序 列 . 得初 始 排 列 可 转 换 到 目标 排 列 。 使 对 于该 问题 . 以 把 数码 的移 动 等 效 成 空 格 的 移 动 。 么对 可 那 于任一排列 , 的 可能的一次 数码移 动最多有 四种 ( 上 、 、 它 即 右
下 、 移动 ) 最 少 有 两 种 ( 左 , 当空 格 位 于 方 阵 四角 时) 。这 样 问 题 就
l 2 3
2 3 4
5
八数码问题C语言A星算法详细实验报告含代码
一、实验内容和要求
八数码问题:在3×3的方格棋盘上,摆放着1到8这八个数码,有1个方格是空的,其初始状态如图1所示,要求对空格执行空格左移、空格右移、空格上移和空格下移这四个操作使得棋盘从初始状态到目标状态。
例如:
图1 八数码问题示意图
请任选一种盲目搜索算法(广度优先搜索或深度优先搜索)或任选一种启发式搜索方法(全局择优搜索,加权状态图搜索,A 算法或A* 算法)编程求解八数码问题(初始状态任选)。选择一个初始状态,画出搜索树,填写相应的OPEN 表和CLOSED表,给出解路径,对实验结果进行分析总结,得出结论。
二、实验目的
1. 熟悉人工智能系统中的问题求解过程;
2. 熟悉状态空间的盲目搜索和启发式搜索算法的应用;
3. 熟悉对八数码问题的建模、求解及编程语言的应用。
三、实验算法
A*算法是一种常用的启发式搜索算法。
在A*算法中,一个结点位置的好坏用估价函数来对它进行评估。A*算法的估价函数可表示为:
f'(n) = g'(n) + h'(n)
这里,f'(n)是估价函数,g'(n)是起点到终点的最短路径值(也称为最小耗费或最小代价),h'(n)是n到目标的最短路经的启发值。由于这个f'(n)其实是无法预先知道的,所以实际上使用的是下面的估价函数:
f(n) = g(n) + h(n)
其中g(n)是从初始结点到节点n的实际代价,h(n)是从结点n到目标结点的最佳路径的估计代价。在这里主要是h(n)体现了搜索的启发信息,因为g(n)是已知的。用f(n)作为f'(n)的近似,也就是用g(n)代替g'(n),h(n)代替h'(n)。这样必须满足两个条件:(1)g(n)>=g'(n)(大多数情况下都是满足的,可以不
76道比较难的C语言题目
│15│14│13│12│11│ │ 6│ 8│13│18│20│ │ 3│18│25│22│11│
├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤ ├─┼─┼─┼─┼─┤
page 1
│10│ 9│ 8│ 7│ 6│ │ 7│14│17│21│24│ │ 4│19│20│21│10│
【15】已知6个城市,用c[i,j]表示从i城市到城市j是否有单向的直达汽车(1
page 2
Байду номын сангаас
=<i〈=6,1〈=j〈=6), c[i,j]=1 表示城市i到城市j有单向直达汽车; 否则 c[i,j]=0. 试编制程序,对于给出的城市代号i,打印出从该城市出发乘车 (包括转车)可以到达的所有城市。 【16】设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。 真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的比 较次数挑出伪造硬币,并鉴定它是重还是轻。 【17】编写一个程序,当输入不超过60个字符组成的英文文字时,计算机将这个句 子中的字母按英文字典字母顺序重新排列,排列后的单词的长度要与原始句子中的长 度相同。例如: 输入: THE PRICE OFBREAD IS ¥1 25 PER POUND 输出: ABC DDEEE EFHIINO OP ¥1 25 PPR RRSTU 并且要求只对A到Z的字母重新排列,其它字符保持原来的状态。 【18】在一线性七个格位置的图上有两种不同颜色的棋子A,B. 排列如下图所示, 中间格的位置为空。 ┎─┰─┰─┰─┰─┰─┰─┒ ┃A┃A┃A┃ ┃B┃B┃B┃ ┖─┸─┸─┸─┸─┸─┸─┚ 要求将A,B的现行位置交换,形成下图中的排列: ┎─┰─┰─┰─┰─┰─┰─┒ ┃B┃B┃B┃ ┃A┃A┃A┃ ┖─┸─┸─┸─┸─┸─┸─┚ 移动棋子的条件: (1) 每个格中只准放一个棋子。(2) 任意一个棋子均可移动一格放入空格内。(3) 一方的棋子均可跳过另一方的一个棋子进入空格。(4) 任何棋子不得跳跃两个或两个 以上棋子(无论颜色同异)(5) 任何一个颜色棋子只能向前跳,不准向后跳。 编程完成有关的移动,并且完成具有2N+1个格子的情形. 其中两种颜色各有N 个棋子,且中间为空格. 【19】(背包问题) 有 N 件物品 d1,......dN,每件物品重量为 W1,..., WN(Wi > 0), 每件物品价值为 V1,......VN (Vi>0)。用这N件物品的某个子集填空背包, 使得所取物品的总重量<=TOTAL,并设法使得背包中物品的价值尽可能高。 【20】(N皇后) 在国际象棋的棋盘上放置N个皇后,使其不能互相攻击,即任意两 个皇后不能处在棋盘的同一行,同一列,同一斜线上,试问共有多少种摆法? 【21】请设计一个程序,由计算机把1.. ̄.8的八个自然数填入图中,使得横、竖 、对角任何两个相邻的小方格中的两个数是不连续的。(下图右侧的 4 个图为禁止的 情形). ┌─┐ ┌─┐ ┌─┐ │ │ │4│ │8│ ┌─┼─┼─┐ └─┼─┐ ┌─┼─┘ │ │ │ │ │5│ │7│ ├─┼─┼─┤ └─┘ └─┘ │ │ │ │ ┌─┐ └─┼─┼─┘ │6│ ┌─┬─┐ │ │ ├─┤ │1│2│ └─┘ │7│ └─┴─┘ └─┘ 【21】在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且仅放 两个*号。 ┌─┬─┬─┬─┐ │*│*│ │ │ ├─┼─┼─┼─┤
C语言机考习题
C语⾔机考习题
2010-2011学年第⼀学期程序设计基础机试题库
⼀、选择结构程序设计部分
1.从键盘接收两个整数,屏幕输出其中较⼤的⼀个。
2.从键盘接收三个整数,屏幕输出最⼤的⼀个。
3.从键盘接收⼀个字母,如果接收的是‘y’或者‘Y’,则输出“正确”。否则输出“错误”
4.从键盘上接收⼀个⼗进制整数,转换成⼆进制输出。
5.从键盘上接收⼀个⼗进制整数,转换成⼋进制输出。
6.从键盘上接收⼀个⼗进制整数,转换成⼗六进制输出。
7.从键盘接收⼀个字符,如果是字母,输出其对应的ASCII码,否则给出提⽰信息“输⼊的不是字母”。8.从键盘接收⼀个三位数的整数,求出每⼀位数字并按逆序输出,如输⼊的数位123,输出的⼀个数位321。
9.要将“china”译成密码。密码规律是:⽤原来的字母后⾯第4个字母代替原来的字母。例如,字母“A”后⾯第4个字母中“E”,⽤“E”代替“A”。因此,“china”应译为“glmre”。请编⼀程序,⽤赋初值的⽅法使c1. c2.c3.c4.c5 5个变量的值分别为’c’. ‘h’. ‘i’. ‘n’.‘a’,经过运算,使c1. c2 c3 c4 c5 的值分别变为’G’. ‘I’ . ‘m’‘r’‘e’, 并输出。
10.从键盘接收⼀个⾃然数,判断它是奇数还是偶数。
11.设圆的半径R=1.5,圆柱⾼H=3,求圆周长.⾯积.球表⾯积.球体积.圆柱体积.⽤scanf输⼊数据,输⼊数据,输出计算结果,输出时要求⽂字说明,取⼩数点后2位数字.请编程序。
12.输⼊⼀个华⽒温度,要求输出摄⽒温度,公式为C=5/9(F-32)输出要有⽂字说明,取两位⼩数。13.编写⼀个程序,求a+|b|,其中a,b为两个整数。
八数码C语言A算法详细代码
#include
#include
#include
#include
#include
using namespace std;
struct node{
int a[3][3]; //存放矩阵
int father; //父节点的位置
int gone; //是否遍历过,1为是,0为否
int fn; //评价函数的值
int x,y; //空格的坐标
int deep; //节点深度
};
vector store; //存放路径节点
int mx[4]={-1,0,1,0};
int my[4]={0,-1,0,1}; //上下左右移动数组
int top; //当前节点在store中的位置
bool check(int num) //判断store[num]节点与目标节点是否相同,目标节点储存在store[0]中
{
for(int i=0;i<3;i++){
for(int j=0;j<3;j++){
if(store[num].a[i][j]!=store[0].a[i][j])
return false;
}
}
return true;
}
bool search(int num) //判断store[num]节点是否已经扩展过 ,没有扩展返回true
{
int pre=store[num].father; //pre指向store[num]的父节点位置
bool test=true;
while(!pre){ //循环直到pre为0,既初始节点
for(int i=0;i<3;i++){
for (int j=0;j<3;j++){
八数码问题C语言代码
八数码问题源程序及注释:
#include<stdio.h>
#include<conio.h>
int n,m;
typedef struct Node
{
char matrix[10];/*存储矩阵*/
char operate;/*存储不可以进行的操作,L代表不能左移R代表不能右移U代表不能上移D代表不能下移*/
char extend;/*是否可以扩展,Y代表可以,N代表不可以*/
int father;/*指向产生自身的父结点*/
}Node;
char start[10]={"83426517 "};/*此处没有必要初始化*/
char end[10]={"1238 4765"};/*此处没有必要初始化*/
Node base[4000];
int result[100];/*存放结果的base数组下标号,逆序存放*/
int match()/*判断是否为目标*/
{
int i;
for(i=0;i<9;i++)
{
if(base[n-1].matrix[i]!=end[i])
{
return 0;
}
}
return 1;
}
void show()/*显示矩阵的内容*/
{
int i=1;
while(m>=0)
{
int mm=result[m];
//clrscr();
printf("\n\n\n 状态方格\t\t步骤 %d",i);
printf("\n\n\n\n\n\t\t\t%c\t%c\t%c\n",base[mm].matrix[0],base[mm].mat rix[1],base[mm].matrix[2]);
八路抢答器电子线路设计(附C语言程序)
电子系统课程设计
姓名:___________ 周康
学号:___________ 24号_______________
专业班级:_________ 嵌入式10
指导教师:一=朱水金
设计题目:八路抢答器
完成时间:2013年07月01日
功能(20%实训(60%设计报告(20%总评
简易难度(10%控制方式
(10%
原理图
(10%
装配图
(10%
元器件焊接
(10%
自控质量
(10%
功能实现
(10%
质量评估
(10%
格式
(5%
内容
(15%
应用科学学院
电子系统课程设计
数字抢答器由主体电路与扩展电路组成。用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。单片机体积小价格低,应用方便,稳定可靠。单片机系统的硬件结构给予了抢答系统“身躯”,而单片机的应用程序赋予了其新的“生命”,使其在传统的抢答器面前具有电路简单、成本低、运行可靠等特色。
关键字:抢答电路报警电路倒计时电路
目录
第一章八路抢答器的概述及制作要求 (4)
1.1 数字抢答器的概述 (4)
1.2 设计任务与要求 (4)
第二章单片机芯片的选择及抢答器方案 (5)
2.1单片机芯片的选择 (5)
2.2模块性能分析 (7)
第三章硬件电路设计 (8)
3.1总体设计 (8)
3.2外部振荡电路 (9)
3.3复位电路的设计 (9)
3.4显示电路的设计 (9)
3.5按钮输入电路的设计 (9)
3.6报警电路的设计 (9)
第四章系统软件设计 (12)
十五数码问题研究及实现
福建电脑
2010年第2期
十五数码问题研究及实现
闵文杰
(重庆交通大学重庆400047)
【摘要】:十五数码问题是人工智能领域中的一个典型问题。本文对该问题进行了详细分析,并用启发式搜索解决了该问题,同时比较了3种不同评估函数的效率。
【关键词】:十五数码问题;启发式搜索;人工智能
1、引言
十五数码问题来源于美国的科学魔术大师萨姆·洛伊德(Sam I.oyd)在1878年推出的著名的"14~15"智力玩具[1]。这个游戏曾经风靡欧美大陆。洛伊德的发明其实只是将重排九宫(即八数码问题)中的3阶方阵扩大到4阶方阵罢了。由于这个细微的变化,十五数码问题的规模远远大于八数码问题,八数码问题的规模较小,总的状态数为9!(=362880)个,而十五数码问题的状态数为16!(≈20.9×1012)个。故十五数码问题更能评价一个算法的"智能"水平。目前,对八数码问题的研究很多,而针对十五数码问题的研究稀少。本文在借鉴八数码问题的基础上用C语言实现了十五数码问题的启发式搜索。
2、十五数码问题
如图1,在一个4x4的正方形上放入数字1,2,……,15,剩余一格为空格。临近空格的数码可
a)初始排列b)目标排列c)
图1十五数码问题
移动到空格上。给定一个初始的排列,目标是找到一个合法的移动序列,使得初始排列可转换到目标排列。
对于该问题,可以把数码的移动等效成空格的移动。那么对于任一排列,它的可能的一次数码移动最多有四种(即上、右、下、左移动),最少有两种(当空格位于方阵四角时)。这样问题就转换成如何从初始排列开始,使空格经过有限的移动次数使排列变成目标排列。
实验二 数码管显示
实验二数码管显示
本实验的目的是掌握数码管的工作原理与使用,实现数码管的静、动态显示。
静态数码管
我们先看看什么是数码管,
上图就是各种长相各种样子的数码管了,肯定很眼熟了吧。
不管将几位数码管连在一起,数码管的显示原理都是一样的,都是靠点亮内部的发光二极管来发光,下面就来我们讲解一个数码管是如何亮起来的。数码管内部电路如下图所示,从右图可看出,一位数码管的引脚是10个,显示一个8字需要7个小段,另外还有一个小数点,所以其内部一共有8个小的发光二极管,最后还有一个公共端,生产商为了封装统一,单位数码管都封装10个引脚,其中第3和第8引脚是连接在一起的。而它们的公共端又可分为共阳极和共阴极,中间图为共阴极内部原理图,右图为共阳极内部原理图。
上图展出了常用的两种数码管的引脚排列和内部结构。总所周知,点亮发光二极管就是要给予它足够大的正向压降。所以点亮数码管其实也就是给它内部相应的发光二极管正向压降。如上图左(一共a、b、c、d、e、f、g、DP 八段),如果要显示“1”则要点亮b、c 两段LED;显示“A”则点亮a、b、c、e、f、g 这六段LED;我们还知道,既然LED 加载的是正向压降,它的两端电压必然会有高低之分:如果八段LED 电压高的一端为公共端,我们称之为共阳极数码管(如上图中);如果八段LED 电压低的一段为公共端,则称之为共阴极数码管(上图右)。所以,要点亮共阳极数码管,则要在公共端给予高于非公共端的电平;反之点亮共阴极数码管,则要在非公共端给予较高电平。
对共阴极数码来说,其8个发光二极管的阴极在数码管内部全部连接在一起,所以称“共阴”,而它们的阳极是独立的,通常在设计电路时一般把阴极接地。当我们给数码管的任意一个阳极加一个高电平时,对应的这个发光二极管就点亮了。如果想要显示出一个8字,并且把右下角的小数点也点亮的话,可以给8个阳极全部送高电平,如果想让它显示出一个0字,那么我们可以除了给第“g, dp”这两位送低电平外,其余引脚全部都送高电平,这样它就显示出0字了。想让它显示几,就给相对应的发光二极管送高电平,因此我们在显示数字的时候首先做的就是给0-9十个数字编码,在要它亮什么数字的时候直接把这个编码送到它的阳极就行了。
单片机课程设计-8位8段LED数码管动态扫描显示
华南理工大学广州汽车学院
单片机课程设计
题目:8位8段LED数码管动态扫描
专业:电子信息工程
班级:09电信(1)班
姓名:付锦辉
学号:************
一、内容要求:
在8位8段LED数码管显示“8.8.8.8.8.8.8.8.”持续500ms,之后灭
显示器200ms;然后显示“WELCOM-1”(由于8位8段LED数码管显示不能显示字母W 和M,所以改为显示“HELLO-93”)
二、目的和意义
1、掌握数码管动态扫描显示原理及实现方法。
2、掌握动态扫描显示电路驱动程序的编写方法。
三、总体方案设计思路
LED数码动态显示的基本做法在于分时轮流选通数码管的公共端,使得各数码管轮流导通,再选通相应的数码管后,即显示字段上得到显示字形码。这种方式数码管的发光效率,而且由于各个数码管的字段线是并联使用的,从而大大简化了硬件线路。
动态扫描显示接口是单片机系统中应用最为广泛的一种显示方式。其接口电路是把所有显示器的8个笔画段A-DP同名端并联在一起,而每个显示器的公共极COM各自独立地接受I/O线控制,CPU向字段输出口送出字段形码是,所有显示器由于同名端并连接收到相同的字形码,但究竟是哪个显示器亮,则取决于COM端,而这一端是由I/O控制的,所以就可以自行决定何时显示哪一位了。而所谓动态扫描是指采用分时的方法,轮流控制各个显示器的COM端,使各个显示器轮流点亮。
再轮流点亮扫描过程中,每位显示器的点亮时间是极为短暂的(约1ms),但由于人的视觉暂留现象及发光二极管的余辉效应,尽管实际上个位显示器并非同时点亮,但只要扫描的速度足够快,给人的影响就是一组稳定的显示数据,不会有闪烁感。
八数码C语言A算法详细代码
#inelude <time.h>
#include <windows.h>
#inelude <veetor>
#inelude <emath> using namespaeestd;
struet no de{
int
a[3][3];
//存放矩阵
int
father;
//父节点的位置
{
for(int i=0;i<3;i++){
for (int j=0;j<3;j++){
if (store[num].a[i][j]!=store[0].a[i][j])
return false ;
}
}
return true ;
}
bool seareh( int num)//判断store[num]节点是否已经扩展过,没有扩展返回true
int
gone;
//是否遍历过,1为是,0为否
int
fn;
//评价函数的值
int
x,y;
//空格的坐标
int
deep;
//节点深度
Baidu Nhomakorabea};
int mx[4]={-1,0,1,0};
深度宽度优先搜索---八数码
Y
.
八数码问题
具体思路:
宽度优先算法实现过程
(1)把起始节点放到OPEN表中;
(2)如果OPEN是个空表,则没有解,失败退出;否则继续;
(3)把第一个节点从OPEN表中移除,并把它放入CLOSED的扩展节点表中;
(4)扩展节点n。如果没有后继节点,则转向(2)
(5)把n的所有后继结点放到OPEN表末端,并提供从这些后继结点回到n的指针;(6)如果n的任意一个后继结点是目标节点,则找到一个解答,成功退出,否则转向(2)。
深度优先实现过程
(1)把起始节点S放入未扩展节点OPEN表中。如果此节点为一目标节点,则得到一个解;(2)如果OPEN为一空表,则失败退出;
(3)把第一个节点从OPEN表移到CLOSED表;
(4)如果节点n的深度等于最大深度,则转向(2);
(5)扩展节点n,产生其全部后裔,并把它们放入OPEN表的前头。如果没有后裔,则转向(2);
(6)如果后继结点中有任一个目标节点,则得到一个解,成功退出,否则转向(2)。
方法一:用C语言实现
#include
#include
#include
typedef long UINT64;
typedef struct
{
char x; //位置x和位置y上的数字换位
char y; //其中x是0所在的位置
} EP_MOVE;
#define SIZE 3 //8数码问题,理论上本程序也可解决15数码问题,
#define NUM SIZE * SIZE //但move_gen需要做很多修改,输入初始和结束状态的部分和check_input也要修改
基于C51单片机的数字时钟课程设计(C语言,带闹钟).
单片机技术课程设计
数字电子钟
学院:
班级:
姓名:
学号:
教师:
摘要
电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。具有时间显示、整点报时、校正等功能。走时准确、显示直观、运行稳定等优点。具有极高的推广应用价值。
关键词:
电子钟 AT89C52 硬件设计软件设计
目录
一、数字电子钟设计任务、功能要求说明及方案介绍 (4)
1.1 设计课题设计任务 (4)
1.2 设计课题的功能要求说明 (4)
1.3 设计课的设计总体方案介绍及工作原理说明 (4)
二、设计课题的硬件系统的设计 (5)
2.1硬件系统各模块功能简要介绍 (5)
2.1.1 AT89C52简介 (5)
2.1.2 按键电路 (6)
三、设计课题的软件系统的设计 (6)
3.1 使用单片机资源的情况 (6)
3.2 软件系统个模块功能简要介绍 (7)
3.3 软件系统程序流程框图 (7)
3.4 软件系统程序清单 (7)
四、设计课题的设计结论、仿真结果、误差分析 (9)
4.1 设计结论及使用说明 (9)
4.2 仿真结果 (10)
第3章(搜索推理技术1-图盲目搜索)
⑤ 把 n 的所有后继节点放到OPEN表的末端,
并提供从这些后继节点回到 n 的指针
⑥ 如果 n 的任一个后继节点是个目标节点,则 找到一个解(反向追踪得到从目标节点到起始 节点的路径),成功退出,否则转向第②步
说明:
OPEN 表是存放待扩展的节点,从数据结构 上来说,它是一个先进先出的队列
3 4 5
1
2 8
3 4 5
2 1 7
3 8 6
4
2
8 6
3 4 5
2 1 7
8 6 5
3
2 1 4 6
8 3 5
2 1 7
8 4
3 5 6
7
6
5
1
7
4
7
8
1
3
8 2
3 1 4
2
8
3
2 7
8 1
3 4
1
2
3
1 8
2
3 4
2
7 6
4
5
7
6 1
4
5
7
8
6
4
5
7
6
5
6
5
7
6
5
目标 节点
生成后继节 点的顺序
图的搜索策略:图搜索过程的一般步骤(基本
思路、框架),经过细化后得到具体算法: 盲目搜索技术(深度、宽度、代价优先算法) 启发式搜索技术(有序算法、A*算法)
单片机控制8位数码管显示秒表课程设计
长沙学院
《单片机原理及应用》
课程设计说明书
题目 LED数码管显示电子秒表设计系(部) **系
专业(班级) *************
姓名邹部长9931
学号******
指导教师***
起止日期 2016.12.19—2016.12.24
《单片机原理及应用》课程设计任务书1系(部):**系专业:******
长沙学院课程设计鉴定表
目录
摘要 (5)
第一章概述 (6)
1.1电子秒表的设计要求 (6)
1.2电子秒表的电路图 (6)
1.3电子秒表的设计原理及方案 (7)
第二章电子秒表的程序设计 (8)
2.1 程序设计流程图 (8)
2.2程序设计源代码 (10)
第三章程序的调试 (16)
第四章设计总结 (17)
参考文献 (18)
摘要
随着经济与社会的发展对智能化和信息化技术要求的不断提高,单片机作为智能控制的核心,逐渐渗透到社会生产和生活的各个方面。而本文则主要阐述基于单片机设计的数码管秒表,这次设计所采用的的单片机为stc89c52单片机,数码管则是使用2个4位共阴LED数码管组成的8位。为减少I/O口,而使用了SM74HC138 和74HCT573这2片芯片实现数码管显示8位数据。利用单片机内部定时器实现计时功能,分别显示为:分—秒—0.01秒。控制则是使用一键控制,可实现计时开始,计时暂停,计时清零3个功能的循环。本次的程序设计采用C语言编写,包括显示程序,定时中断服务程序,延时程序。最后在单片机电路板来观察工作状态。
第一章概述
1.1电子秒表的设计要求
○1显示要求在初始状态显示的是00—00—00,最左边的2位显示分钟,中间2位显示秒,左边2位显示十分之一秒和百分之一秒,还有个2个LED数码管只显示中间那一段,用作间隔符。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 源代码及实验结果截图
#include
#include
#include
//八数码状态对应的节点结构体
struct Node{
int s[3][3];//保存八数码状态,0代表空格
int f,g;//启发函数中的f和g值
struct Node * next;
struct Node *previous;//保存其父节点
};
int open_N=0; //记录Open列表中节点数目
//八数码初始状态
int inital_s[3][3]={
2,8,3,1,6,4,7,0,5
};
//八数码目标状态
int final_s[3][3]={
2,1,6,4,0,8,7,5,3
};
//------------------------------------------------------------------------ //添加节点函数入口,方法:通过插入排序向指定表添加
//------------------------------------------------------------------------ void Add_Node( struct Node *head, struct Node *p)
{
struct Node *q;
if(head->next)//考虑链表为空
{ q = head->next;
if(p->f < head->next->f){//考虑插入的节点值比链表的第一个节点值小
p->next = head->next;
head->next = p;
}
else {
while(q->next)//考虑插入节点x,形如a<= x <=b
{
if((q->f < p->f ||q->f == p->f) && (q->next->f > p->f || q->next->f == p->f)){
p->next = q->next;
q->next = p;
break;
}
q = q->next;
}
if(q->next == NULL) //考虑插入的节点值比链表最后一个元素的值更大
q->next = p;
}
}
else head->next = p;
}
//------------------------------------------------------------------------
//删除节点函数入口
//------------------------------------------------------------------------
void del_Node(struct Node * head, struct Node *p )
struct Node *q;
q = head;
while(q->next)
{
if(q->next == p){
q->next = p->next;
p->next = NULL;
if(q->next == NULL) return;
// free(p);
}
q = q->next;
}
}
//------------------------------------------------------------------------ //判断两个数组是否相等函数入口
//------------------------------------------------------------------------ int equal(int s1[3][3], int s2[3][3])
{
int i,j,flag=0;
for(i=0; i< 3 ; i++)
for(j=0; j< 3 ;j++)
if(s1[i][j] != s2[i][j]){flag = 1; break;}
if(!flag)
return 1;
else return 0;
//------------------------------------------------------------------------ //判断后继节点是否存在于Open或Closed表中函数入口
//------------------------------------------------------------------------ int exit_Node(struct Node * head,int s[3][3], struct Node *Old_Node)
{
struct Node *q=head->next;
int flag = 0;
while(q)
if(equal(q->s,s)) {
flag=1;
Old_Node->next = q;
return 1;}
else q = q->next;
if(!flag) return 0;
}
//------------------------------------------------------------------------ //计算p(n)的函数入口
//其中p(n)为放错位的数码与其正确的位置之间距离之和
//具体方法:放错位的数码与其正确的位置对应下标差的绝对值之和
//------------------------------------------------------------------------ int wrong_sum(int s[3][3])
{
int i,j,fi,fj,sum=0;
for(i=0 ; i<3; i++)