别人问的倒牛奶问题 暴搜

#include <queue>
#include <iostream>
using namespace std;
int n[3], c, k;
int re[10010][3];
bool hash[100][100][100];
class Node
{
    public :
        int N[3];
        Node *pre;
};

Node node[10010];
void bfs()
{
    queue <Node> Q;
    Node next;
    memset(hash, 0, sizeof(hash));
    node[0].N[0] = n[0];
    node[0].N[1] = 0;
    node[0].N[2] = 0;
    node[0].pre = NULL;
    hash[n[0]][0][0] = 1;
    Q.push(node[0]);
    k = 0;
    while (!Q.empty())
    {
        node[k] = Q.front();
        Q.pop();

        if (node[k].N[0] == c || node[k].N[1] == c || node[k].N[2] == c)
        {
            return;
        }

        int i, j;
        for (i = 0; i < 3; ++i)
        {
            for(j = 0; j < 3; ++j)
            if(i != j && node[k].N[i] != 0)
            {
                next.N[j] = (node[k].N[i] >= (n[j] - node[k].N[j]))
                    ? n[j] : (node[k].N[i] +  node[k].N[j]);
                next.N[i] = (node[k].N[i] >= (n[j] - node[k].N[j]))
                    ? (node[k].N[i] - n[j] + node[k].N[j]) : 0;
                next.N[3 - i - j] = node[k].N[3 - i - j];
                next.pre = &node[k];
                if (!hash[next.N[0]][next.N[1]][next.N[2]])
                {
                    //cout << next.N[0] << " " << next.N[1] << " " << next.N[2] << endl;
                    hash[next.N[0]][next.N[1]][next.N[2]] = 1;
                    Q.push(next);
                }
            }
        }
        k++;
    }
}
int main()
{
    while (scanf("%d %d %d %d", &n[0], &n[1], &n[2], &c) != EOF)
    {
        bfs();
        int i, j = 0;
        Node *p = &node[k];
        while (p != NULL)
        {
            re[j][0] = (*p).N[0];
            re[j][1] = (*p).N[1];
            re[j][2] = (*p).N[2];
            j++;
            p = p->pre;
        }
        for (i = j - 1; i >= 0; --i)
        {
            printf("%d %d %d\n", re[i][0], re[i][1], re[i][2]);
        }
    }
    return 0;
}

posted on 2009-04-18 17:20  ZAFU_VA  阅读(198)  评论(0编辑  收藏  举报

导航