人工智能——猴子摘香蕉问题(C++

目录

目录

目录

1.解决问题思想:

2.问题描述:

3.谓词表示:

描述谓词:

驱动谓词:

4.问题解决思路:

5.代码实现:

头文件定义:

 结构体定义:

函数定义:

主函数:


1.解决问题思想:

        把一个问题中的情景抽象成一个封闭的系统,以此来分析系统中的个体与个体的联系。


2.问题描述:

        房间里有一只猴子,位于a处,在c处天花板处有一串香蕉,猴子想吃但够不着。b处有一个箱子,如果猴子站到箱子上,就可以摸着天花板便可以摘到香蕉。


3.谓词表示:

描述谓词:

AT(x,y):x在y处

ONBOX:猴子在箱子上

HB:猴子摘到香蕉

其中,x的个体于是{monkey,box,banana},y的个体域是{a,b,c}。

驱动谓词:

GOTO(u,v):猴子从u走到v处

PUSHBOX(v,w):猴子推箱子从v到w处

CLIMBBOX:猴子爬上箱子


4.问题解决思路:

猴子从a走到b,推箱子从b到c,猴子爬上箱子,摘到香蕉。

推广:从键盘输入猴子、箱子的位置,再判断是否需要推箱子。


5.代码实现:

头文件定义:

#include <iostream>
#include <string>
using namespace std;

 结构体定义:

struct monkey {    //猴子
	string locate[5] = {"a","b","c"};    //位置
	string name = "monkey";    //名字
	int l = 0;    //指示位置
	void AT() {    //位置表示
		cout << mo.name << "位于" << mo.locate[mo.l] << "处" << endl;
	}
	int onbox = 0;    //表示是否在箱子上
}mo;

struct box {    //箱子
	string locate[5] = { "a","b","c" };
	string name = "box";
	int l = 1;
	void AT() {
		cout << bo.name << "位于" << bo.locate[bo.l] << "处" << endl;
	}
}bo;

struct banana {    //香蕉
	string locate[5] = { "a","b","c" };
	string name = "banana";
	int l = 2;
	void AT() {
		cout << ba.name << "位于" << ba.locate[ba.l] << "处" << endl;
	}
}ba;

函数定义:

void ONBOX() {    //是否在箱子上
	if(mo.onbox == 1)
		cout << "猴子在箱子上" << endl;
	else
		cout << "猴子没在箱子上" <<endl;
}

void GOTO() {    //移动
	if ((mo.l == 0 || mo.l == 2) && bo.l == 1) {
		cout << "猴子从 " << mo.locate[mo.l];
		mo.l = 1;
		cout <<  " GOTO " << mo.locate[mo.l] << endl;
	}
	else if(mo.l == 1 && bo.l == 1){
		cout << "猴子和箱子一起在" << bo.locate[bo.l] << endl;
	}
	else if ((mo.l == 0 || mo.l == 1) && bo.l == 2){
		cout << "猴子从 " << mo.locate[mo.l];
		mo.l = 2;
		cout << " GOTO " << mo.locate[mo.l] << endl;
	}
	else if (mo.l == 2 && bo.l == 2) {
		cout << "猴子和箱子一起在" << bo.locate[bo.l] << endl;
	}
	else if ((mo.l == 1 || mo.l == 2) && bo.l == 0) {
		cout << "猴子从 " << mo.locate[mo.l];
		mo.l = 0;
		cout << " GOTO " << mo.locate[mo.l] << endl;
	}
	else if (mo.l == 0 && bo.l == 0) {
		cout << "猴子和箱子一起在" << bo.locate[bo.l] << endl;
	}
}

void PUSHBOX() {    //推箱子
	if(bo.l != 2){
	cout << "猴子从"<< mo.locate[mo.l] <<"推箱子到" ;
	mo.l = 2;
	bo.l = 2;
	cout <<  bo.locate[bo.l]  << endl;
	}
}

void CLIMBBOX() {    //爬箱子
	if ((mo.l == 2) && (bo.l == 2)) {
		cout << "猴子爬上箱子" << endl;
		mo.onbox = 1;
	}	
}	


void now() {    //当前状态
	cout << endl << "当前状态:" <<endl;
	mo.AT();
	bo.AT();
	ba.AT();
	ONBOX();
	cout << endl;
}

主函数:

int main() {
	cout << "0表a,1表b,2表c\n";

	cout << "输入猴子的位置:\n";
	cin >> mo.l;
	cout << "输入箱子的位置:\n";
	cin >> bo.l;
	if((mo.l != 0 && mo.l!=1 && mo.l != 2)||
		(bo.l != 0 && bo.l != 1 && bo.l != 2)){
		cout << "数据输入错误,程序结束.";
		return 0;
	}

	now();

	GOTO();
	PUSHBOX();
	CLIMBBOX();

	now();
	cout << "猴子摘得香蕉" << endl;
	return 0;	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值