bfs ZOJ 1005 Jugs
bfs
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream>
2 #include <queue>
3 using namespace std;
4
5 struct jug
6 {
7 int current_a;
8 int current_b;
9 int max_a;
10 int max_b;
11 string path;
12 };
13
14 int goal_capacity;
15 queue<jug> Q;
16 jug a;
17 jug b;
18 void bfs();
19 bool flag[100][100];
20 void print(string);
21
22 int main()
23 {
24
25 freopen("test.txt", "r", stdin);
26
27 while(cin >> a.max_a >> a.max_b >> goal_capacity)
28 {
29 a.current_a = 0;
30 a.current_b = 0;
31 a.path = "";
32 for (int i = 0; i < 100; i++)
33 {
34 for (int j = 0; j < 100; j++)
35 {
36 flag[i][j] = false;
37 }
38 }
39 b.max_a = a.max_a;
40 b.max_b = a.max_b;
41 bfs();
42
43 }
44 return 0;
45 }
46
47 void bfs()
48 {
49 while(!Q.empty())
50 Q.pop();
51
52 Q.push(a);
53 flag[a.current_a][a.current_b] = true;
54
55 while (!Q.empty())
56 {
57 a = Q.front();
58 Q.pop();
59
60 if (a.current_b == goal_capacity)
61 {
62 print(a.path);
63 cout << "success" << endl;
64 break;
65 }
66
67 if (a.current_a < a.max_a)
68 {
69 b.current_a = a.max_a;
70 b.current_b = a.current_b;
71 b.path = a.path;
72 if (!flag[b.current_a][b.current_b])
73 {
74 flag[b.current_a][b.current_b] = true;
75 b.path += "1";
76 Q.push(b);
77 }
78
79 }
80 if (a.current_b < a.max_b)
81 {
82 b.current_a = a.current_a;
83 b.current_b = a.max_b;
84 b.path = a.path;
85 if (!flag[b.current_a][b.current_b])
86 {
87 flag[b.current_a][b.current_b] = true;
88 b.path += "2";
89 Q.push(b);
90 }
91
92 }
93 if (a.current_a > 0)
94 {
95 b.current_a = 0;
96 b.current_b = a.current_b;
97 b.path = a.path;
98 if (!flag[b.current_a][b.current_b])
99 {
100 flag[b.current_a][b.current_b] = true;
101 b.path += "3";
102 Q.push(b);
103 }
104
105 }
106 if (a.current_b > 0)
107 {
108 b.current_a = a.current_a;
109 b.current_b = 0;
110 b.path = a.path;
111 if (!flag[b.current_a][b.current_b])
112 {
113 flag[b.current_a][b.current_b] = true;
114 b.path += "4";
115 Q.push(b);
116 }
117
118 }
119 if (a.current_a > 0 && a.current_b < a.max_b)//A pour B
120 {
121 if (a.current_a <= a.max_b - a.current_b)
122 {
123 b.current_b = a.current_b + a.current_a;
124 b.current_a = 0;
125 }
126 else
127 {
128 b.current_a = a.current_a - (a.max_b-a.current_b);
129 b.current_b = a.max_b;
130 }
131 b.path = a.path;
132 if (!flag[b.current_a][b.current_b])
133 {
134 flag[b.current_a][b.current_b] = true;
135 b.path += "5";
136 Q.push(b);
137 }
138
139 }
140 if (a.current_b > 0 && a.current_a < a.max_a)//B pour A
141 {
142 if (a.current_b <= a.max_a - a.current_a)
143 {
144 b.current_a = a.current_a + a.current_b;
145 b.current_b = 0;
146 }
147 else
148 {
149 b.current_a = a.max_a;
150 b.current_b = a.current_b - (a.max_a - a.current_a);
151 }
152 b.path = a.path;
153 if (!flag[b.current_a][b.current_b])
154 {
155 flag[b.current_a][b.current_b] = true;
156 b.path += "6";
157 Q.push(b);
158 }
159
160 }
161 }
162
163
164 }
165
166 void print(string a)
167 {
168 for (int i = 0; i < a.size(); i++)
169 {
170 switch (a[i] - '1')
171 {
172 case 0: cout << "fill A" << endl;
173 break;
174 case 1: cout << "fill B" << endl;
175 break;
176 case 2: cout << "empty A" << endl;
177 break;
178 case 3: cout << "empty B" << endl;
179 break;
180 case 4: cout << "pour A B" << endl;
181 break;
182 case 5: cout << "pour B A" << endl;
183 break;
184 }
185 }
186 }
187