如果用状态这个术语来表示的话,那么显然,两个杯子中水的情况对应了一个状态。 所以用BFS很容易求出最小值。
该题的打印路径其实和紫书上第6张中迷宫问题用的方法是一样的,用一个父亲指针记录路劲个,这样就可以很方便的打印出路径。
细节参见代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<list>
#include<set>
#include<cmath>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const int INF = 1e9;
const int maxn = 100 + 15;
int n,m,T,a,b,c,t,d[maxn][maxn];
char ans[maxn][maxn],table[20][maxn] = {"FILL(2)","FILL(1)","DROP(1)","DROP(2)","POUR(2,1)","POUR(1,2)"};
struct node{
int a,b;
char s[maxn];
node(int a=0, int b=0): a(a),b(b) {}
bool operator == (const node& rhs) const {
return a == rhs.a && b == rhs.b;
}
}path[maxn][maxn];
void print(node u) {
int cnt = 0;
while(d[u.a][u.b]>0) {
memcpy(ans[cnt],u.s,sizeof(u.s));
cnt++;
u = path[u.a][u.b];
}
printf("%d\n",cnt);
for(int i=cnt-1;i>=0;i--) {
printf("%s\n",ans[i]);
}
}
void bfs(node s) {
queue<node> q; s.s[0] = 's'; s.s[1] = '\0';
memset(d,-1,sizeof(d));
d[s.a][s.b] = 0;
q.push(s);
while(!q.empty()) {
node u = q.front(); q.pop();
if(u.a == c || u.b == c) { print(u); return ; }
node v = u;
memcpy(v.s,table[0],sizeof(table[0]));
v.b = b;
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
} v = u;
memcpy(v.s,table[1],sizeof(table[1]));
v.a = a;
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
} v = u;
memcpy(v.s,table[2],sizeof(table[2]));
v.a = 0;
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
} v = u;
memcpy(v.s,table[3],sizeof(table[3]));
v.b = 0;
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
} v = u;
memcpy(v.s,table[4],sizeof(table[4]));
if(v.a+v.b <= a) { v.a += v.b; v.b = 0; }
else { v.b -= (a-v.a); v.a = a; }
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
} v = u;
memcpy(v.s,table[5],sizeof(table[5]));
if(v.a+v.b <= b) { v.b += v.a; v.a = 0; }
else { v.a -= (b-v.b); v.b = b; }
if(d[v.a][v.b] == -1) {
d[v.a][v.b] = d[u.a][u.b] + 1;
path[v.a][v.b] = u;
q.push(v);
}
}
printf("impossible\n");
return ;
}
int main() {
scanf("%d%d%d",&a,&b,&c);
if(a < c && b < c) printf("impossible\n");
else bfs(node(0,0));
return 0;
}