蒟蒻感觉思路没错啊……
查看原帖
蒟蒻感觉思路没错啊……
213218
蒟蒻CGZ楼主2020/10/11 19:57

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;
}

2020/10/11 19:57
加载中...