Poj 3414 Pots
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Poj 3414 Pots相关的知识,希望对你有一定的参考价值。
题意:给出两个水桶,你可以进行如下操作
1 :FILL(i) 用水龙头将第i个桶装满。
2 :DROP(i)将第i个桶的水倒掉。
3:POUR(i,j)将第i个桶的水倒入第j个桶
(1<=i<=2)也就是说,只有两个桶,(感觉我只是在翻译)
给出 两个桶的容量 A,B,以及目标量K,要求你通过以上操作,将其中任意一个桶的水量变成 K,并且两只桶一开始是空的。
1 #include <cstdio> 2 #define N 10005 3 using namespace std; 4 struct node 5 { 6 int o,fa,s,a,b; 7 }; 8 int res[N]; 9 const int Fill1 = 0,Fill2=1 ,Drop1 = 2,Drop2=3, Pour1 = 4,Pour2=5; 10 const char opr[6][10] = { "FILL(1)", "FILL(2)", "DROP(1)", "DROP(2)", "POUR(1,2)", "POUR(2,1)" }; 11 node q[N]; 12 int f, r; 13 bool vis[102][102]; 14 void push(int a,int b,int fa,int s,const int o){ 15 vis[a][b] = true; 16 q[r].a = a; 17 q[r].b = b; 18 q[r].o = o; 19 q[r].fa = fa; 20 q[r].s = s; 21 r++; 22 } 23 24 int a, b,c; 25 int bfs(){ 26 f = r = 0; 27 node p; 28 push(0, 0, -1, 0,-1); 29 vis[0][0] = true; 30 while (f < r){ 31 p.a = q[f].a; p.b = q[f].b; p.fa = q[f].fa; p.o = q[f].o; p.s = q[f].s;f++; 32 if (p.a == c || p.b == c)return p.s; 33 if (p.a){ 34 if (vis[0][p.b] == false)push(0, p.b, f - 1, p.s + 1, Drop1); 35 if (p.b < b){ 36 if (b - p.b > p.a){ 37 if (vis[0][p.b + p.a] == false)push(0,p.b+p.a,f-1,p.s+1,Pour1); 38 } 39 else{ 40 if (vis[p.a - (b - p.b)][b] == false)push(p.a - (b - p.b), b, f - 1, p.s + 1,Pour1); 41 } 42 } 43 } 44 if (p.b){ 45 if (vis[p.a][0] == false)push(p.a, 0, f - 1, p.s + 1,Drop2); 46 if (p.a < a){ 47 if (a - p.a > p.b){ 48 if (vis[p.a+p.b][0] == false)push( p.b + p.a, 0,f - 1, p.s + 1,Pour2); 49 } 50 else{ 51 if (vis[a][p.b-(a-p.a)] == false)push(a, p.b-(a-p.a), f - 1, p.s + 1,Pour2); 52 } 53 } 54 } 55 if (p.a<a){ 56 if (vis[a][p.b] == false)push(a, p.b, f - 1, p.s + 1, Fill1); 57 } 58 if (p.b<b){ 59 if (vis[p.a][b] == false)push(p.a, b, f - 1, p.s + 1, Fill2); 60 } 61 } 62 return -1; 63 } 64 void print(){ 65 int n=0; 66 for (int i = f - 1; i != -1; i = q[i].fa, n++) 67 res[n] = q[i].o; 68 for (int i = n-1; i >= 0;i--){ 69 puts(opr[res[i]]); 70 } 71 } 72 int main() 73 { 74 scanf("%d%d%d", &a, &b, &c); 75 int ans = bfs(); 76 if (ans != -1){ 77 printf("%d", ans); 78 print(); 79 } 80 else puts("impossible"); 81 return 0; 82 }
要解决的问题主要是回溯输出的问题,方法是通过一个父指针来知道每一个状态的前一次状态。其他的就没什么了,说实话,其实我
是不想做这题了,因为撸了好久bfs了,很厌倦,而且又是我熟悉的倒水问题,但是看到了这个回溯的需求想试试,但其实主要时间还是花在了
正确描述状态变化上。。。还有,因为不知道puts原来是在左右都加换行符,WA了一次,好冤。。。。话说,上一题刚写得像C++而不是是C了,这一题又回来了。。。
以上是关于Poj 3414 Pots的主要内容,如果未能解决你的问题,请参考以下文章