解题思路:本题可以把两个罐子中的水量看成二维坐标中的点,然后套一下bfs的板子就行了
C++代码
#include <bits/stdc++.h>
// #define int long long
using namespace std;
const int N = 110;
int dist[N][N]; //判重
struct Node //记录坐标及该坐标怎么拓展过来的
{
int x, y;
string s;
};
string op[6]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"}; //定义6种操作
int a, b, c;
int bfs()
{
memset(dist, 0x3f, sizeof dist);
queue<Node> q;
q.push({0, 0, ""});
dist[0][0] = 0;
while (q.size())
{
auto t = q.front();
q.pop();
int xx = t.x, yy = t.y;
if (xx == c || yy == c)
{
cout << dist[xx][yy] << endl;
for (int i = 0; i < t.s.size(); i ++ )
{
cout << op[t.s[i]] << endl;
}
return 0;
}
//下面四行代码定义了坐标点拓展的偏移量
int t1 = min(xx, b - yy);
int t2 = min(a - xx, yy);
int dx[6] = {a - xx, 0, -xx, 0, -t1, t2};
int dy[6] = {0, b - yy, 0, - yy, t1, -t2};
for (int i = 0; i < 6; i ++ )
{
int a = xx + dx[i], b = yy + dy[i];
if (dist[a][b] == 0x3f3f3f3f)
{
dist[a][b] = dist[xx][yy] + 1;
q.push({a, b, t.s + (char)i});
}
}
}
cout<<"impossible"<<endl;
return 0;
}
signed main()
{
cin >> a >> b >> c;
bfs();
return 0;
}
创作不易,大家可以在AcWing注册账号,参与一下AC之星计划,我的邀请码是MYRGS。对题解有任何疑问可以在评论区下面评论