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; }
相关文章推荐
- POJ 3414 Pots【bfs模拟倒水问题】
- POJ 3414 Pots【bfs模拟倒水问题】
- poj 3414 Pots [bfs - 倒水问题]
- poj 3414 Pots [bfs - 倒水问题]
- poj 3414 pots (bfs 倒水问题)
- POJ3414 Pots【倒水问题+BFS】
- POJ 3414 Pots【bfs模拟倒水问题】
- poj 3414 倒水问题 bfs
- POJ 3414-Pots(BFS-模拟倒水)
- POJ 3414 Pots(BFS 倒水)
- POJ 3414 - Easy BFS - 六入口倒水问题
- POJ 3414 Pots (BFS)
- H - Pots POJ 3414 算是小白书所讲的一般隐式图搜索, BFS
- POJ 3414 Pots (BFS)
- POJ 3414 Pots (DFS || BFS)
- POJ 3414 Pots ( BFS , 打印路径 )
- POJ 3414 Pots (经典bfs )
- POJ 3414 Pots BFS
- poj 3414 pots [经典 BFS ]
- POJ 3414 Pots bfs打印方案