UVA 571 Jugs
2013-01-15 18:07
316 查看
大意不再赘述。
思路:这道题写了好久额。
说是说数学题,但我用隐式图的遍历过了。开两个数组,fa记录前驱,f记录当前操作,然后模拟即可。
还有一个BUG,操作的时候,最好把cur.v[0],cur.v[1]分别赋给两个变量ca,cb,要不然会导致结果出错而且不容易查错。
思路:这道题写了好久额。
说是说数学题,但我用隐式图的遍历过了。开两个数组,fa记录前驱,f记录当前操作,然后模拟即可。
还有一个BUG,操作的时候,最好把cur.v[0],cur.v[1]分别赋给两个变量ca,cb,要不然会导致结果出错而且不容易查错。
#include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cstring> #include <string> #include <queue> using namespace std; const int MAXN = 1010; const int INF = 0x3f3f3f3f; struct node { int v[2]; }q[1005*10050]; int fa[1005*10050]; int f[1005*10050]; bool vis[1010][1010]; int jugs[2], goal; char answer[10][100] = {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"}; void init() { memset(vis, 0, sizeof(vis)); } void print_ans(int i) { if(!i) return ; else { print_ans(fa[i]); printf("%s\n", answer[f[i]]); } } void bfs() { node cur; int front = 0, rear = 1; q[0].v[0] = 0, q[0].v[1] = 0, fa[1] = 0; vis[0][0] = 1; while(front < rear) { cur = q[front]; int ca = cur.v[0], cb = cur.v[1]; if(ca != jugs[0] && !vis[jugs[0]][cb]) // fill A { cur.v[0] = jugs[0]; cur.v[1] = cb; f[rear] = 0; fa[rear] = front; vis[jugs[0]][cb] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } if(cb != jugs[1] && !vis[ca][jugs[1]]) // fill B { cur.v[0] = ca; cur.v[1] = jugs[1]; f[rear] = 1; fa[rear] = front; vis[ca][jugs[1]] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } if(ca && !vis[0][cb]) // empty A { cur.v[0] = 0; cur.v[1] = cb; f[rear] = 2; fa[rear] = front; vis[0][cb] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } if(cb && !vis[ca][0]) // empty B { cur.v[0] = ca; cur.v[1] = 0; f[rear] = 3; fa[rear] = front; vis[ca][0] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } if(ca && cb != jugs[1]) // pour A B { if(jugs[1] >= ca+cb && !vis[0][ca+cb]) { cur.v[1] = ca+cb; cur.v[0] = 0; f[rear] = 4; fa[rear] = front; vis[0][ca+cb] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } else if(!vis[ca+cb-jugs[1]][jugs[1]]) { cur.v[0] = ca+cb-jugs[1]; cur.v[1] = jugs[1]; f[rear] = 4; fa[rear] = front; vis[ca+cb-jugs[1]][jugs[1]] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } } if(cb && ca != jugs[0]) //pour B A { if(jugs[0] >= ca+cb && !vis[ca+cb][0]) { cur.v[0] = ca+cb; cur.v[1] = 0; f[rear] = 5; fa[rear] = front; vis[ca+cb][0] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } else if(!vis[jugs[0]][ca+cb-jugs[0]]) { cur.v[1] = ca+cb-jugs[0]; cur.v[0] = jugs[0]; f[rear] = 5; fa[rear] = front; vis[jugs[0]][ca+cb-jugs[0]] = 1; if(cur.v[1] == goal) break; q[rear++] = cur; } } front++; } print_ans(rear); printf("success\n"); } void solve() { init(); bfs(); } int main() { while(~scanf("%d%d%d", &jugs[0], &jugs[1], &goal)) { solve(); } return 0; }
相关文章推荐
- Jugs - UVa 571 bfs
- UVA 571 Jugs ADD18 小白书10 数学Part1 专题
- UVA571- Jugs
- UVA 571 Jugs(经典倒水问题)
- uva571 - Jugs(水壶)
- UVA - 571 Jugs
- uva 571 - Jugs
- UVA - 571 - Jugs (数论 - 经典倒水问题)
- uva 571 Jugs
- UVA 571 Jugs
- UVa 571 - Jugs (数论)
- uva 571 - Jugs(倒水问题)
- UVA - 571 Jugs
- poj 1606 Jugs and poj 3414 Pots(数组模拟BFS) uva 571 (数论)
- UVa 571 - Jugs
- UVa:571 Jugs
- UVa 571 Jugs (想法题)
- ZOJ 1005 - Jugs | UVA 571 - Jugs
- UVa 571 Jugs(经典倒水问题)
- UVa - 571 - Jugs -(倒水问题)