目录
目录
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;
}