Professional Documents
Culture Documents
The implementation for BFS is done by using queue. Also, a state (n, m)
is translated into an integer i for convenience.
*/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
class Queue
{
public:
Queue()
: head(NULL), tail(NULL)
{
}
void enqueue(int i)
{
if (head == NULL)
head = tail = new Node(i, NULL);
else
tail = tail->next = new Node(i, NULL);
}
int dequeue()
{
Node* old = head;
head = head->next;
int i = old->i;
delete old;
return i;
}
int isEmpty()
{
return (head == NULL);
}
~Queue()
{
while (!isEmpty())
dequeue();
}
private:
struct Node
{
int i;
Node* next;
int N, M, k, n, m;
int distance[MAX_I];
int prev[MAX_I];
int iToN(int i)
{
return i / (M + 1);
}
int iToM(int i)
{
return i % (M + 1);
}
void trace(int i)
{
if (i > 0)
trace(prev[i]);
cout <<" "<<iToN(i) << " | " <<iToM(i) << "\n";
}
void test(int n, int m, int n1, int m1)
{
if (n1 < 0 || n1 > N || m1 < 0 || m1 > M)
return;
if (distance[i1] != 0)
return;
int solve()
{
n = m = 0;
distance[0] = 1;
iQueue.enqueue(0);
while (!iQueue.isEmpty())
{
int i = iQueue.dequeue();
int n = iToN(i);
int m = iToM(i);
if (n == k || m == k || n + m == k)
return i;
// fill a jug
test(n, m, N, m);
test(n, m, n, M);
int i = solve();
OUTPUT