波瓦松的分酒问题

波瓦松的分酒问题

#include <iostream>
#include <math.h>
using namespace std;
struct Node {
    int bottle12;
    int bottle8;
    int bottle5;
};
#define START { 12,0,0 }
#define END { 6,6,0 }
int times = 0;
bool move12to8(Node n1, Node& n2) {
    if (n1.bottle12 == 0 || n1.bottle8 == 8)
        return false;
    else if (n1.bottle12 >= (8 - n1.bottle8)) {
        n2.bottle12 = n1.bottle12 + n1.bottle8 - 8;
        n2.bottle8 = 8;
    }
    else if (n1.bottle12 < (8 - n1.bottle8)) {
        n2.bottle12 = 0;
        n2.bottle8 = n1.bottle12 + n1.bottle8;
    }
    n2.bottle5 = n1.bottle5;
    return true;
}
bool move8to12(Node n1, Node& n2) {
    if (n1.bottle8 == 0 || n1.bottle12 == 12)
        return false;
    else if (n1.bottle8 <= (12 - n1.bottle12)) {
        n2.bottle12 = n1.bottle12 + n1.bottle8;
        n2.bottle8 = 0;
    }
    n2.bottle5 = n1.bottle5;
    return true;
}
bool move12to5(Node n1, Node& n2) {
    if (n1.bottle12 == 0 || n1.bottle5 == 5)
        return false;
    else if (n1.bottle12 >= (5 - n1.bottle5)) {
        n2.bottle5 = 5;
        n2.bottle12 = n1.bottle12 + n1.bottle5 - 5;
    }
    else if (n1.bottle12 < (5 - n1.bottle5)) {
        n2.bottle12 = 0;
        n2.bottle5 = n1.bottle5 + n1.bottle12;
    }
    n2.bottle8 = n1.bottle8;
    return true;
}
bool move5to12(Node n1, Node& n2) {
    if (n1.bottle5 == 0 || n1.bottle12 == 12)
        return false;
    else if (n1.bottle5 <= (12 - n1.bottle12)) {
        n2.bottle12 = n1.bottle12 + n1.bottle5;
        n2.bottle5 = 0;
    }
    n2.bottle8 = n1.bottle8;
    return true;
}
bool move8to5(Node n1, Node& n2) {
    if (n1.bottle8 == 0 || n1.bottle5 == 5)
        return false;
    else if (n1.bottle8 >= (5 - n1.bottle5)) {
        n2.bottle5 = 5;
        n2.bottle8 = n1.bottle8 + n1.bottle5 - 5;
    }
    else if (n1.bottle8 < (5 - n1.bottle5)) {
        n2.bottle5 = n1.bottle5 + n1.bottle8;
        n2.bottle8 = 0;
    }
    n2.bottle12 = n1.bottle12;
    return true;
}
bool move5to8(Node n1, Node& n2) {
    if (n1.bottle5 == 0 || n1.bottle8 == 8)
        return false;
    else if (n1.bottle5 >= (8 - n1.bottle8)) {
        n2.bottle5 = n1.bottle5 + n1.bottle8 - 8;
        n2.bottle8 = 8;
    }
    else if (n1.bottle5 < (8 - n1.bottle8)) {
        n2.bottle5 = 0;
        n2.bottle8 = n1.bottle8 + n1.bottle5;
    }
    n2.bottle12 = n1.bottle12;
    return true;
}
bool equals(Node n1, Node n2) {
    if (n1.bottle12 != n2.bottle12) return false;
    if (n1.bottle5 != n2.bottle5) return false;
    if (n1.bottle8 != n2.bottle8) return false;
    return true;
}
bool contains(Node n, Node* path, int length) {
    for (int i = 0; i < length; i++) {
        if (equals(n, path[i])) {
            return true;
        }
    }
    return false;
}
void printout(Node* path, int length) {
    times++;
    cout << "[" << times << "]" << endl;
    cout << 12 << " " << 8 << " " << 5 << endl;
    for (int i = 0; i < length; i++)
        cout << i + 1 << ":[" << path[i].bottle12 << "] [" << path[i].bottle8 << "] [" << path[i].bottle5 << "]" << endl;
}
void search(Node start, Node* path, int length) {
    path[length] = start;
    Node temp = { 0,0,0 };
    length++;
    if (equals(start, END))
        printout(path, length);
    if (move12to5(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
    if (move5to12(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
    if (move12to8(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
    if (move8to12(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
    if (move8to5(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
    if (move5to8(start, temp) && !contains(temp, path, length))
        search(temp, path, length);
}
int main() {
    Node path[100];
    search(START, path, 0);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值