人鸡狗过河问题c编程
#include
#include
typedef struct
{
int a, b, c, d;
} Vector;
void Add(Vector *vector1, Vector vector2,
Vector* resultVector)
{
resultVector->a = (vector1->a + vector2.a) % 2;
resultVector->b = (vector1->b + vector2.b) % 2;
resultVector->c = (vector1->c + vector2.c) % 2;
resultVector->d = (vector1->d + vector2.d) % 2;
}
typedef struct myNode
{
Vector* stateVector;
myNode* childs[4];
myNode* parent;
} Node;
void Copy(Vector* targetVector, Vector* sourceVector)
{
targetVector->a = sourceVector->a;
targetVector->b = sourceVector->b;
targetVector->c = sourceVector->c;
targetVector->d = sourceVector->d;
}
bool Equal(Vector* vector1, Vector* vector2)
{
return vector1->a == vector2->a
&& vector1->b == vector2->b
&& vector1->c == vector2->c
&& vector1->d == vector2->d;
}
bool IsStateAllowed(Vector* stateVector, Vector* allowedStateVectors)
{
for (int i = 0; i < 10 ; i++)
{
if (Equal(stateVector, &allowedStateVectors[i]))
{
return true;
}
}
return false;
}
bool HasExistInTree(Vector* targetVector, Node* tree)
{
if (Equal(targetVector, tree->stateVector))
return true;
else
{
for (int i = 0; i < 4 ; i++)
{
if (tree->childs[i] != NULL &&
HasExistInTree(targetVector, tree->childs[i]))
{
return true;
}
}
}
return false;
}
void PrintAnswer(Node* node)
{
while (node != NULL)
{
printf("(%d, %d, %d, %d)", node->stateVector->a, node->stateVector->b,
node->stateVector->c, node->stateVector->d);
node = node->parent;
}
printf("\n");
}
void GenerateTree(Node* p, Vector* overRiverVectors, Node* tree, Vector* endState,
Vector* allowedStateVectors)
{
Vector* resultVector = (Vector*)malloc(sizeof(Vector));
for (int i = 0; i < 4 ; i++)
{
Add(p->stateVector, overRiverVectors[i], resultVector);
if (!HasExistInTree(resultVector, tree) &&
IsStateAllowed(resultVector, allowedStateVectors