大意不再赘述。
思路:这道题写了好久额。
说是说数学题,但我用隐式图的遍历过了。开两个数组,fa记录前驱,f记录当前操作,然后模拟即可。
还有一个BUG,操作的时候,最好把cur.v[0],cur.v[1]分别赋给两个变量ca,cb,要不然会导致结果出错而且不容易查错。
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
const int MAXN = 1010;
const int INF = 0x3f3f3f3f;
struct node
{
int v[2];
}q[1005*10050];
int fa[1005*10050];
int f[1005*10050];
bool vis[1010][1010];
int jugs[2], goal;
char answer[10][100] = {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};
void init()
{
memset(vis, 0, sizeof(vis));
}
void print_ans(int i)
{
if(!i) return ;
else
{
print_ans(fa[i]);
printf("%s\n", answer[f[i]]);
}
}
void bfs()
{
node cur;
int front = 0, rear = 1;
q[0].v[0] = 0, q[0].v[1] = 0, fa[1] = 0;
vis[0][0] = 1;
while(front < rear)
{
cur = q[front];
int ca = cur.v[0], cb = cur.v[1];
if(ca != jugs[0] && !vis[jugs[0]][cb]) // fill A
{
cur.v[0] = jugs[0];
cur.v[1] = cb;
f[rear] = 0;
fa[rear] = front;
vis[jugs[0]][cb] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
if(cb != jugs[1] && !vis[ca][jugs[1]]) // fill B
{
cur.v[0] = ca;
cur.v[1] = jugs[1];
f[rear] = 1;
fa[rear] = front;
vis[ca][jugs[1]] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
if(ca && !vis[0][cb]) // empty A
{
cur.v[0] = 0;
cur.v[1] = cb;
f[rear] = 2;
fa[rear] = front;
vis[0][cb] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
if(cb && !vis[ca][0]) // empty B
{
cur.v[0] = ca;
cur.v[1] = 0;
f[rear] = 3;
fa[rear] = front;
vis[ca][0] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
if(ca && cb != jugs[1]) // pour A B
{
if(jugs[1] >= ca+cb && !vis[0][ca+cb])
{
cur.v[1] = ca+cb;
cur.v[0] = 0;
f[rear] = 4;
fa[rear] = front;
vis[0][ca+cb] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
else if(!vis[ca+cb-jugs[1]][jugs[1]])
{
cur.v[0] = ca+cb-jugs[1];
cur.v[1] = jugs[1];
f[rear] = 4;
fa[rear] = front;
vis[ca+cb-jugs[1]][jugs[1]] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
}
if(cb && ca != jugs[0]) //pour B A
{
if(jugs[0] >= ca+cb && !vis[ca+cb][0])
{
cur.v[0] = ca+cb;
cur.v[1] = 0;
f[rear] = 5;
fa[rear] = front;
vis[ca+cb][0] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
else if(!vis[jugs[0]][ca+cb-jugs[0]])
{
cur.v[1] = ca+cb-jugs[0];
cur.v[0] = jugs[0];
f[rear] = 5;
fa[rear] = front;
vis[jugs[0]][ca+cb-jugs[0]] = 1;
if(cur.v[1] == goal) break;
q[rear++] = cur;
}
}
front++;
}
print_ans(rear);
printf("success\n");
}
void solve()
{
init();
bfs();
}
int main()
{
while(~scanf("%d%d%d", &jugs[0], &jugs[1], &goal))
{
solve();
}
return 0;
}