RT,为什么连样例都过不了
vis
是标记一下这个状态走过了没有,如果为true
就是走过了,再搜下去不可能更优了,于是直接退出
代码,C++
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
bool vis[N][N];
int T, ca, cb, n;
inline int read() {
int x = 0, f = 1; char ch = getchar();
while(!isdigit(ch)) {if(ch == '-') f = -f; ch = getchar();}
while(isdigit(ch)) {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
return x * f;
}
struct Node {
int a, b;
vector<int> vec; // 动态数组存操作过程
};
queue<Node> q;
inline void bfs() {
while(!q.empty()) {
Node u = q.front(); q.pop();
// printf("%d %d\n", u.a, u.b);
if(u.b == n) {
printf("%d ", u.vec.size());
for (int i = 0; i < u.vec.size(); ++ i)
printf("%d ", u.vec[i]);
puts("");
return ;
}
if(u.a != ca && !vis[ca][u.b]) { // fill A
vis[ca][u.b] = true;
u.vec.push_back(1);
q.push((Node){ca, u.b, u.vec});
u.vec.pop_back();
}
if(u.b != cb && !vis[u.a][cb]) { // fill B
vis[u.a][cb] = true;
u.vec.push_back(2);
q.push((Node){u.a, cb, u.vec});
u.vec.pop_back();
}
if(u.a != 0 && !vis[0][u.b]) { // empty A
vis[0][u.b] = true;
u.vec.push_back(3);
q.push((Node){0, u.b, u.vec});
u.vec.pop_back();
}
if(u.b != 0 && !vis[u.a][0]) { // empty B
vis[u.a][0] = true;
u.vec.push_back(4);
q.push((Node){u.a, 0, u.vec});
u.vec.pop_back();
}
if(u.b != 0 && u.a != ca) { // pour B -> A
if(u.b <= ca - u.a && !vis[u.a + u.b][0]) {
vis[u.a + u.b][0] = true;
u.vec.push_back(5);
q.push((Node){u.a + u.b, 0, u.vec});
u.vec.pop_back();
}
else if(!vis[ca][u.b - (ca - u.a)]) {
vis[ca][u.b - (ca - u.a)] = true;
u.vec.push_back(5);
q.push((Node){ca, u.b - (ca - u.a), u.vec});
u.vec.pop_back();
}
}
if(u.a != 0 && u.b != cb) { // pour A -> B
if(u.a <= cb - u.b && !vis[0][u.b + u.a]) {
vis[0][u.b + u.a] = true;
u.vec.push_back(6);
q.push((Node){0, u.b + u.a, u.vec});
u.vec.pop_back();
}
else if(!vis[u.a - (cb - u.b)][cb]) {
vis[u.a - (cb - u.b)][cb] = true;
u.vec.push_back(6);
q.push((Node){u.a - (cb - u.b), cb, u.vec});
u.vec.pop_back();
}
}
}
}
int main() {
T = read();
for(int i = 1; i <= T; ++ i) {
ca = read(); cb = read(); n = read();
memset(vis, false, sizeof vis);
while(q.size()) q.pop();
vis[0][0] = true;
vector<int> tmp; tmp.clear();
q.push((Node){0, 0, tmp});
bfs();
}
return 0;
}