题目意思:

猴子定义了4个状态  空手移动,推箱子,爬箱子,摘香蕉 用 (w,x,y,z)描述

w定义了猴子位置

x为1表示猴子在箱子上,0表示不在箱子上

y表示箱子位置

z为1表示猴子摘到香蕉(结束),为0表示没有摘到香蕉(继续搜索)

目前仍有些bug

随机生产 猴子 箱子 香蕉的位置,通过BFS搜索并记录路径得出猴子的行走轨迹(因为是宽松搜,得到的就是最优解)

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstdlib>
#include<stdio.h>
#include<ctime>
#include<cstring>
#include<cmath>
#define INF 0x3f3f3f3f
#define MAX 100000
using namespace std;
int a,b,c;//a 猴子 b箱子 c香蕉
int dir[2][2] = {{0,-1},{0,1}};
struct Node{int w,x,y,z;int close;
};
int pa[MAX];
int end;
Node nodes[MAX];
int getDis(int x1, int x2){return abs(x2-x1);
}void go(int w,int x, int y, int z){if(x == 1 && z== 0){printf("猴子在%d位置爬上箱子\n",w);}else if(x == 1 && z == 1){//printf("猴子在位置%d爬上箱子\n",w);printf("猴子在%d位置摘到香蕉\n",w);}else if(x == 0 && y != w){printf("猴子空手到达%d位置\n",w);}else if(x == 0 && y == w){printf("猴子推箱子到达位置%d\n",w);}}
int step = 1;
void print(int e){int w,x,y,z,close;if(pa[e] != -1){print(pa[e]);Node node = nodes[e];w = node.w;//猴子位置x = node.x;//是否在箱子上y = node.y;//箱子位置z = node.z;//是否摘到香蕉//printf("\t");printf("第%d步 :",step++);go(w,x,y,z);}}
void getBana(){int w,x,y,z;int head, tail;memset(pa,-1,sizeof(pa));head = tail = 0;printf("猴子,箱子,香蕉的初始位置分别为%d %d %d\n\n",a,b,c);if(a == b && b == c){printf("猴子在位置%d爬上箱子\n",a);printf("猴子在%d位置摘到香蕉\n",a);return ;}if(b == c){//箱子初始位置与香蕉位置相同 不能往下走了if(b > a){while(a < b){++a;printf("猴子空手到达%d\n",a);}}else{while(a > b){--a;printf("猴子空手到达%d\n",a);}}printf("猴子在位置%d爬上箱子\n",a);printf("猴子在%d位置摘到香蕉\n",a);}nodes[tail].w = a;nodes[tail].x = 0;nodes[tail].y = b;nodes[tail].z = 0;tail++;while(head < tail){Node node = nodes[head];w = node.w;//猴子位置x = node.x;//是否在箱子上y = node.y;//箱子位置z = node.z;//是否摘到香蕉//go(w,x,y,z);if(x == 1 && z == 1){end = head;break;}if(x == 1 && w == c){pa[tail] = head;nodes[tail].w = w;nodes[tail].x = 1;nodes[tail].y = y;nodes[tail].z = 1;tail++;}if(x != 1){if(w == y){//不在箱子上 并且在同一位置for(int i = 0; i < 2; ++i) {int nw = w + dir[i][1];if(nw < 0) continue;if(w == y && getDis(c,nw) > getDis(c,w)) continue;pa[tail] = head;nodes[tail].w = nw;//往前推nodes[tail].x = 0;nodes[tail].y = nw;nodes[tail].z = 0;nodes[tail].close = 1;tail++;pa[tail] = head;nodes[tail].w = nw;//上箱子尝试摘nodes[tail].x = 1;nodes[tail].y = nw;nodes[tail].z = 0;tail++;}}if(w != y){//不在箱子上  不在同一位置for(int i = 0; i < 2; ++i) {int nw = w + dir[i][1];if(nw < 0) continue;pa[tail] = head;nodes[tail].w = nw;//上箱子尝试摘nodes[tail].x = 0;nodes[tail].y = b;nodes[tail].z = 0;tail++;}}}head++;}
//        printf("%d\n",end);
//        for(int i = 0; i < 20; ++i){
//          printf("%d ",pa[i]);
//      }print(end);}int main(){ios::sync_with_stdio(false);srand((unsigned)time(NULL));a = rand()%(10-0)+1;b = rand()%(10-0)+1;c = rand()%(10-0)+1;//    cin >> a >> b >> c;getBana();return 0;}

人工智能实验 猴子摘香蕉相关推荐

  1. 人工智能实验——猴子摘香蕉python

    import random # 全局变量i i = 0 monkey = [] box = [] banana = [] monbox = [] getit = []def Monkey_goto(A ...

  2. JAVA语言写的人工智能小实验——猴子摘香蕉

    背景简介/问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态 ...

  3. C#编写简单的人工智能课程的实验-猴子摘香蕉

    1.实验内容 用C#,编写完成了使用者分别输入猴子.香蕉.箱子所在的位置,输出完整的猴子摘香蕉的过程. 2.大致逻辑 首先由使用者输入猴子.箱子和香蕉所在的位置,首先判断猴子和箱子是否在同一位置,若不 ...

  4. 人工智能程序——猴子摘香蕉(C语言)

    问题说明: 房间内有一只猴子,一个箱子和一个挂在天花板上的香蕉.三者的位置如下图所示: 初始状态:三者在输入的初始位置,猴子手上无香蕉,猴子不在箱子上. 目标状态:三者均在香蕉对应的位置,猴子手上有香 ...

  5. 人工智能算法 猴子摘香蕉

    只有简单的状态显示 #include "iostream"using namespace std; void AT(char monkeyplace, char boxplace) ...

  6. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次.docx...

    人工智能课内实验报告(8次)学 院: 自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号: 目 录课内实验1:猴子摘香蕉问题的VC编程实现--------1课内实验2:编程实现简单动 ...

  7. 用python语言实现人工智能猴子摘香蕉的问题_人工智能实验报告大全:猴子摘香蕉问题的VC编程实现等八次 -...

    人工智能课内实验报告 (8次) 学 院:自动化学院 班 级: 智能1501 姓 名: 刘少鹏(34) 学 号:06153034 目 录 课内实验1:猴子摘香蕉问题的VC编程实现????????1 课内 ...

  8. 【C++】人工智能实验一 猴子摘香蕉/传教士与野人(含完整代码与状态迁移图)

    文章目录 一.猴子摘香蕉问题 1.问题描述 2.解题思路 3.实验结果及分析 实验结果一 实验结果二 实验结果三 4.实验结果 5.实验代码 二.传教士(牧师)与野人问题 1.问题描述 2.实验步骤 ...

  9. 【SC应用】【人工智能】Java实现猴子摘香蕉,动画显示

    人工智能课程实验一的任务,写出猴子摘香蕉问题的知识表示,并用代码实现推理过程 问题描述 一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等).设房间里还有一 ...

最新文章

  1. [NC13C]形态形成场/[Gym100430B]Divisible Substrings
  2. python同步异步_python中Tornado的同步与异步I/O的介绍(附示例)
  3. 操作系统一:内核态的开销
  4. 本地方法中printf如何传给java--java系统级命名管道
  5. C语言实验——拍皮球_JAVA
  6. jQuery 判断元素是否存在
  7. C#中数据类型转换-显式转换
  8. 我的博客网站开发6——博文关键字搜索
  9. 怎样基于谷歌地图的Server缓存公布Image Service服务
  10. linux磁盘管理------LVM
  11. 【二十三】win 10 :Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告
  12. MDK5 安装指导书
  13. 使用秀米编排点击展示H5
  14. Office2010新体验-基于Office Visio 2010 图表绘制新体验
  15. 互联网公司无线接入平台怎么样
  16. te40终端不设网关_默认网关不可用什么原因|默认网关不能用解决方法|默认网关怎么设置...
  17. vue图片查看器,支持放大 缩小 还原
  18. 免费在线图片识别文字工具
  19. soot中存在的主要对象、soot的执行流
  20. Error starting daemon: error initializing graphdriver: driver not supported

热门文章

  1. 河南景区免门票致数千游客滞留 未制定应急预案-河南-景区-免门票
  2. 如何在工作中鼓励持续的反馈
  3. 期货从入门到高深系列之手动交易---软件的使用D3
  4. 注册机偷懒写法2、之直接调用源程序的函数
  5. 视觉识别数字、十字路口和T字路口,巡线于一体的基于openmv的解决方案(2021年电赛f题)
  6. Spring的aop开发(四)通知类型
  7. 如何用PDF阅读器给PDF文件添加文字?
  8. 哪个企业邮箱海外收发邮件好用呢?
  9. Android开发-helloAndroid
  10. 品赏第一行“Android代码“---Hello World