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 }
View Code

 

 

 

要解决的问题主要是回溯输出的问题,方法是通过一个父指针来知道每一个状态的前一次状态。其他的就没什么了,说实话,其实我

是不想做这题了,因为撸了好久bfs了,很厌倦,而且又是我熟悉的倒水问题,但是看到了这个回溯的需求想试试,但其实主要时间还是花在了

正确描述状态变化上。。。还有,因为不知道puts原来是在左右都加换行符,WA了一次,好冤。。。。话说,上一题刚写得像C++而不是是C了,这一题又回来了。。。

以上是关于Poj 3414 Pots的主要内容,如果未能解决你的问题,请参考以下文章

poj 3414 Pots

Pots(POJ-3414)BFS

POJ 3414 Pots

Poj 3414 Pots

POJ 3414 Pots

POJ 3414 Pots