别人问的倒牛奶问题 暴搜
#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;
}
#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;
}