您的位置:首页 > 其它

POJ 3414 Pots(BFS倒水问题)

2010-09-18 15:21 309 查看
//BFS倒水问题,对于需要打印解得广搜题,必须保存搜索状态和状态的父亲指针,然后逆推,根据状态和状态之间的关系
//判断属于那一种情况,并将解记录,还有POJ的1606也是同样类型的题,只不过要求有点点不一样,规模也有点点不一样
//代码也就不重复贴了~
#include<iostream>
#include<queue>
#include<vector>
#include<string>
using namespace std;
bool vis[105][105];
int A,B,C;
vector<string> ans;
struct State
{
int a,b,step,fa;
State(int aa,int bb,int Step,int Fa)
{	a = aa;	b = bb;	step = Step;	fa = Fa;}
};
vector<State> st;
int bfs()
{
int p = -1;
int ta,tb,step,fa;
memset(vis,0,sizeof(vis));
queue<int> q;
vis[0][0] = 1;
st.push_back(State(0,0,0,-1));
q.push(p = st.size()-1);
while(!q.empty())
{
ta = st[q.front()].a;
tb = st[q.front()].b;
step = st[q.front()].step;
fa = q.front();
if(ta == C || tb == C)	return q.front();
q.pop();
if(!vis[A][tb])
{
st.push_back(State(A,tb,step+1,fa));
vis[A][tb] = 1;
q.push(++p);
}
if(!vis[ta][B])
{
st.push_back(State(ta,B,step+1,fa));
vis[ta][B] = 1;
q.push(++p);
}
if(!vis[0][tb])
{
st.push_back(State(0,tb,step+1,fa));
vis[0][tb] = 1;
q.push(++p);
}
if(!vis[ta][0])
{
st.push_back(State(ta,0,step+1,fa));
vis[ta][0] = 1;
q.push(++p);
}
if(ta + tb >= B)
{
if(!vis[ta+tb-B][B])
{
st.push_back(State(ta+tb-B,B,step+1,fa));
vis[ta+tb-B][B] = 1;
q.push(++p);
}
}
else
{
if(!vis[0][ta+tb])
{
st.push_back(State(0,ta+tb,step+1,fa));
vis[0][ta+tb] = 1;
q.push(++p);
}
}
if(ta + tb >= A)
{
if(!vis[A][ta+tb-A])
{
st.push_back(State(A,ta+tb-A,step+1,fa));
vis[A][ta+tb-A] = 1;
q.push(++p);
}
}
else
{
if(!vis[ta+tb][0])
{
st.push_back(State(ta+tb,0,step+1,fa));
vis[ta+tb][0] = 1;
q.push(++p);
}
}
}
return -1;
}
void readState(State x,State y)//读取当前状态和父亲状态
{
if(x.a + x.b == y.a + y.b)//如果两个状态水量之和相等,只能是倒来倒去
{
if(x.a < y.a)	ans.push_back("POUR(2,1)");
if(x.b < y.b)	ans.push_back("POUR(1,2)");
}
else if(x.a + x.b > y.a + y.b)//显然啦~
{
if(y.a == 0)	ans.push_back("DROP(1)");
if(y.b == 0)	ans.push_back("DROP(2)");
}
else if(x.a + x.b < y.a + y.b)//不用说了吧?
{
if(y.a == A)	ans.push_back("FILL(1)");
if(y.b == B)	ans.push_back("FILL(2)");
}
}
int main()
{
int cur,pre,res;
while(scanf("%d%d%d",&A,&B,&C) != EOF)
{
res = cur = bfs();
if(res == -1)
{
cout <<"impossible/n";
continue;
}
pre = st[cur].fa;
ans.clear();
while(pre != -1)
{
pre = st[cur].fa;
readState(st[pre],st[cur]);
cur = st[cur].fa;
pre = st[pre].fa;
}
cout << st[res].step << endl;
for(int i = ans.size()-1;i >= 0;--i)
{
cout << ans[i] << endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: