波瓦松的分酒问题
#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;
}