正经题解|倒水问题
2024-03-22 11:04:03
发布于:浙江
136阅读
0回复
0点赞
【算法分析】
可以从 (0,0) 状态开始广搜,在广搜的每一步记录 x,y,step,s,分别表示第一个杯子装的水,第二个杯子装的水,达到这个状态需要的步数,达到这个状态的操作步骤。
【参考代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2 + 9;
bool vis[maxn][maxn];
struct node {
int x, y, step;
string s;
}l, r;
int main() {
int n, m, k;
cin >> n >> m >> k;
vis[0][0] = 1;
queue<node> q;
q.push({ 0,0,0,"" });
while (q.size()) {
r = q.front();
q.pop();
if (r.x == k || r.y == k) {
cout << r.step << '\n' << r.s;
return 0;
}
l.x = n, l.y = r.y, l.step = r.step + 1, l.s = r.s + "FILL(1)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
l.x = r.x, l.y = m, l.step = r.step + 1, l.s = r.s + "FILL(2)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
l.x = 0, l.y = r.y, l.step = r.step + 1, l.s = r.s + "DROP(1)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
l.x = r.x, l.y = 0, l.step = r.step + 1, l.s = r.s + "DROP(2)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
l.x = max(0, r.x + r.y - m), l.y = min(m, r.x + r.y), l.step = r.step + 1, l.s = r.s + "POUR(1,2)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
l.x = min(n, r.x + r.y), l.y = max(0, r.x + r.y - n), l.step = r.step + 1, l.s = r.s + "POUR(2,1)\n";
if (!vis[l.x][l.y]) {
vis[l.x][l.y] = 1;
q.push(l);
}
}
cout << "impossible";
return 0;
}
【时间复杂度】
【预计得分】
这里空空如也
有帮助,赞一个