一.题解分析
这是一道bfs的题目,初看毫无头绪,经过点拨后恍然大悟,我们需要记录其六个操作,对每次选择时每个操作进行入队检查,最终得到任意一个罐子里的水等于c,记录其总操作步数,并进行输出.这里的操作类似于走迷宫时,我们设置的方向数组.然后我们在输出操作时,可以用一个数组记录对应操作的序号,在结束时通过序号输出操作.
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <algorithm>
using namespace std;
#define N 10005
struct node {
int x, y;
int step[N];
int sum;
};
int A, B, C;
bool vis[105][105];
bool bfs()
{
memset(vis, 0, sizeof(vis));//清空
queue<node>q;
node a, b;
a.x = a.y = a.sum = 0;
vis[a.x][a.y] = 1;
q.push(a);
while (!q.empty())
{
a = q.front();
q.pop();
if (a.x == C || a.y == C)//结束条件,如果有一个罐子里的水等于C,结束
{
cout << a.sum << endl;//输出操作步数
for (int i = 1; i <= a.sum; i++) {//通过数组序号,输出对应操作
if (a.step[i] == 1) cout << "FILL(1)" << endl;
if (a.step[i] == 2) cout << "FILL(2)" << endl;
if (a.step[i] == 3) cout << "DROP(1)" << endl;
if (a.step[i] == 4) cout << "DROP(2)" << endl;
if (a.step[i] == 5) cout << "POUR(1,2)" << endl;
if (a.step[i] == 6) cout << "POUR(2,1)" << endl;
}
return true;
}
for (int i = 1; i <= 6; i++) {//循环枚举每轮操作
b = a;
if (i == 1) b.x = A;
if (i == 2) b.y = B;
if (i == 3) b.x = 0;
if (i == 4) b.y = 0;
if (i == 5) {
if (a.x + a.y <= B) {//在A倒入B时要判断,A是否有剩余
b.x = 0;
b.y = a.x + a.y;
}
else {
b.x = a.x + a.y - B;
b.y = B;
}
}
if (i == 6) {
if (a.x + a.y <= A) {//在B倒入A时要判断,B是否有剩余
b.x = a.x + a.y;
b.y = 0;
}
else {
b.x = A;
b.y = a.x + a.y - A;
}
}
if (!vis[b.x][b.y]) {
vis[b.x][b.y] = 1;
b.sum = a.sum + 1;
b.step[b.sum] = i;//记录操作序号
q.push(b);
}
}
}
return false;
}
int main()
{
cin >> A >> B >> C;
if (!bfs())
cout << "impossible" << endl;
return 0;
}
二.java学习进度总结
1.关于java学习的全部软件已经按照完成并完成其环境的配置.
2.初步了解java语言的特点,了解java入门的相关知识.
3.开始学习java的基础知识和语法.