题意简述:给出两个壶的容量A和B, 一个目标水量C,对A、B可以有3种操作,求最少经过几步操作能够在某个壶中得到目标水量C。输入A、B和C,输入最少操作数和操作过程。
问题分析:把A和B壶中水量作为状态,初始状态为<0,0>,每个操作都是状态变化的过程。因为有2个壶,所以总共有6种操作。使用BFS搜索来找到最少的操作步数。同时需要考虑操作的条件,以减少操作来加快程序运行速度。
程序说明:搜索过的状态就不需要再搜索了,用数组notvist[][]来标记搜索过的状态。操作的前提条件已经写在程序中。
AC的C++语言程序如下:
/* POJ3414 Pots */
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int MAXN = 100;
int a, b, c;
bool notvist[MAXN+1][MAXN+1];
struct node {
int a, b, level;
char path[MAXN+1];
int plen;
};
string path[] = {
"FILL(1)"
,"FILL(2)"
,"DROP(1)"
,"DROP(2)"
,"POUR(1,2)"
,"POUR(2,1)"
};
void output_result(int lvl, char p[], int n)
{
cout << lvl << endl;
for(int i=0; i<n; i++)
cout << path[(int)p[i]] << endl;
}
void bfs()
{
queue<node> q;
memset(notvist, true, sizeof(notvist));
node f;
f.a = 0;
f.b = 0;
f.level = 0;
memset(f.path, 0, sizeof(f.path));
f.plen = 0;
q.push(f);
notvist[f.a][f.b] = false;
while(!q.empty()) {
f = q.front();
q.pop();
if(f.a == c || f.b == c) {
output_result(f.level, f.path, f.plen);
return;
}
node v;
v = f;
v.level++;
v.plen++;
// FILL(a)
if(a - f.a > 0) {
v.a = a;
v.b = f.b;
if(notvist[v.a][v.b]) {
v.path[f.plen] = 0;
q.push(v);
notvist[v.a][v.b] = false;
}
}
// FILL(b)
if(b - f.b > 0) {
v.a = f.a;
v.b = b;
if(notvist[v.a][v.b]) {
v.path[f.plen] = 1;
q.push(v);
notvist[v.a][v.b] = false;
}
}
// DROP(a)
if(f.a) {
v.a = 0;
v.b = f.b;
if(notvist[v.a][v.b]) {
v.path[f.plen] = 2;
q.push(v);
notvist[v.a][v.b] = false;
}
}
// DROP(b)
if(f.b) {
v.a = f.a;
v.b = 0;
if(notvist[v.a][v.b]) {
v.path[f.plen] = 3;
q.push(v);
notvist[v.a][v.b] = false;
}
}
// POUR(a,b)
if(f.a && (f.b < b)) {
if(f.a > (b - f.b)) {
v.a = f.a -(b - f.b);
v.b = b;
} else {
v.a = 0;
v.b = f.b + f.a;
}
if(notvist[v.a][v.b]) {
v.path[f.plen] = 4;
q.push(v);
notvist[v.a][v.b] = false;
}
}
// POUR(b,a)
if(f.b && (f.a < a)) {
if(f.b > (a - f.a)) {
v.a = a;
v.b = f.b -(a - f.a);
} else {
v.a = f.a + f.b;
v.b = 0;
}
if(notvist[v.a][v.b]) {
v.path[f.plen] = 5;
q.push(v);
notvist[v.a][v.b] = false;
}
}
}
cout << "impossible" << endl;
}
int main()
{
cin >> a >> b >> c;
bfs();
return 0;
}原文:http://blog.csdn.net/tigerisland45/article/details/52208174