HDU

来源:互联网 发布:网站源码修改工具 编辑:程序博客网 时间:2024/06/17 12:02

题目大意:中文题。一开始以为一定要两个杯子相同,后来发现瓶子也是可以当杯子用的,只要均分就行……天真了
解题思路:六个入口 BFS,没什么难的,复制的时候漏改了调了好久才发现

#include<iostream>#include<stdio.h>#include<algorithm>#include<cmath>#include<string.h>#include<string>#include<queue>#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))const int INF = 0x3f3f3f3f;const int NINF = -INF -1;const int MAXN = 100+10;using namespace std;struct point {    int s, n, m;    int cnt;};bool vis[MAXN][MAXN][MAXN];int S, N, M;int bfs() {    queue<point> q;    point p;    p.s = S;    p.n = p.m = p.cnt = 0;    q.push(p);    vis[p.s][p.n][p.m] = 1;    while (!q.empty()) {        point now = q.front();        q.pop();//      printf("%d %d %d %d\n", now.s, now.n, now.m, now.cnt);        if ((now.s == S/2 && now.n == S/2)||            (now.s == S/2 && now.m == S/2)||            (now.n == S/2 && now.m == S/2))                 return now.cnt;        for (int i = 0; i < 6; i++) {            p = now;            p.cnt = now.cnt+1;            if (i == 0) { //s->n                p.n += p.s;                p.s = 0;                if (p.n > N) {                    p.s = p.n - N;                    p.n = N;                }            }            if (i == 1) { //s->m                p.m += p.s;                p.s = 0;                if (p.m > M) {                    p.s = p.m - M;                    p.m = M;                }            }            if (i == 2) { //n->s                p.s += p.n;                p.n = 0;                if (p.s > S) continue;            }            if (i == 3) { //n->m                p.m += p.n;                p.n = 0;                if (p.m > M) {                    p.n = p.m - M;                    p.m = M;                }            }            if (i == 4) { //m->s                p.s += p.m;                p.m = 0;                if (p.s > S) continue;            }            if (i == 5) { //m->n                p.n += p.m;                p.m = 0;                if (p.n > N) {                    p.m = p.n - N;                    p.n = N;                }            }            if (!vis[p.s][p.n][p.m]) {                q.push(p);                vis[p.s][p.n][p.m] = 1;            }        }    }    return -1;}int main() {    while (scanf("%d%d%d", &S, &N, &M) && S+N+M) {        memset(vis, 0, sizeof(vis));        int ans = -1;        if (S%2 == 0) ans = bfs();        if (ans == -1) printf("NO\n");        else printf("%d\n", ans);    }    return 0;}