计蒜客 无脑博士 bfs

来源:互联网 发布:北京阿里云招聘 编辑:程序博客网 时间:2024/05/01 01:03

               题目链接无脑博士的试管们

          思路:直接模拟倒水过程即可,但是需要记忆判断当前的情况是否已经处理过。dfs和bfs都ok

AC代码

#include <cstdio>#include <cmath>#include <cctype>#include <algorithm>#include <cstring>#include <utility>#include <string>#include <iostream>#include <map>#include <set>#include <vector>#include <queue>#include <stack>using namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> typedef long long LL;const int maxn = 20 + 5;int dp[maxn][maxn];set<int>ans;int v[3];void dfs(int a, int b, int c) {//printf("%d %d %d\n", a, b, c);if(dp[a][b]) return;dp[a][b] = 1;if(a == 0) ans.insert(c);//倒水 for(int i = 0; i < 3; ++i) {for(int j = 0; j < 3; ++j) {if(i == j) continue;int u[3] = {a, b, c};int pour = min(u[i], v[j]-u[j]);if(pour == 0) continue;u[i] -= pour;u[j] += pour;dfs(u[0], u[1], u[2]);}}}int main() {while(scanf("%d%d%d", &v[0], &v[1], &v[2]) == 3) {ans.clear();memset(dp, 0, sizeof(dp));dfs(0, 0, v[2]);for(set<int>::iterator it = ans.begin(); it != ans.end(); ++it) {if(it == ans.begin()) printf("%d", *it);else printf(" %d", *it);}printf("\n");}return 0;}

如有不当之处欢迎指出!

0 0