非常可乐 HDU1495

#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<limits.h>
#include<queue>
#include<stack>
using namespace std;
#define max(a, b) a>b?a:b
#define min(a, b) a<b?a:b
#define N 110
typedef struct maze
{
    int a, b, c, step;
} MAZE;
int s, n, m, visit[N][N][N];
void BFS();
int main()
{
    while(scanf("%d%d%d", &s, &n, &m), s+n+m)
    {
        if(s%2!=0)
            printf("NO\n");
        else
            BFS();
    }
    return 0;
}
void BFS()
{
    queue<MAZE>que;
    memset(visit, 0, sizeof(visit));
    MAZE p, q;
    p.a=s;
    p.b=0;
    p.c=0;
    p.step=0;
    visit[p.a][p.b][p.c]=1;
    que.push(p);
    while(!que.empty())
    {
        p=que.front();
        que.pop();
        if((p.a==p.b&&p.c==0)||(p.a==p.c&&p.b==0)||(p.b==p.c&&p.a==0))
        {
            printf("%d\n", p.step);
            return;
        }
        q=p;
        if(p.a!=0)
        {
            if(p.a>n-p.b)//也就是说p.a还有剩余
            {
                //q= (MAZE) {p.a-n+p.b, n, p.c, p.step+1};
                q.a=p.a-n+p.b;
                q.b=n;
                q.c=p.c;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE) {0, p.a+p.b, p.c, p.step+1};
                q.a=0;
                q.b=p.a+p.b;
                q.c=p.c;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.a>m-p.c)//也就是说p.a还有剩余
            {
                // q=(MAZE) {p.a-m+p.c, p.b, m, p.step+1};
                q.a=p.a-m+p.c;
                q.b=p.b;
                q.c=m;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {0, p.b, p.c+p.a, p.step+1};
                q.a=0;
                q.b=p.b;
                q.c=p.c+p.a;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
        if(p.b!=0)
        {
            if(p.b>s-p.a)//也就是说p.b还有剩余
            {
                //q= (MAZE) {s, p.b-s+p.a, p.c, p.step+1};
                q.a=s;
                q.b=p.b-s+p.a;
                q.c=p.c;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE) {p.a+p.b, 0, p.c, p.step+1};
                q.a=p.a+p.b;
                q.b=0;
                q.c=p.c;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.b>m-p.c)//也就是说p.b还有剩余
            {
                //q= (MAZE) {p.a, p.b-m+p.c, m, p.step+1};
                q.a=p.a;
                q.b=p.b-m+p.c;
                q.c=m;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {p.a, 0, p.c+p.b, p.step+1};
                q.a=p.a;
                q.b=0;
                q.c=p.c+p.b;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
        if(p.c!=0)
        {
            if(p.c>s-p.a)//也就是说p.c还有剩余
            {
                //q= (MAZE) {s, p.b, p.c-s+p.a, p.step+1};
                q.a=s;
                q.b=p.b;
                q.c=p.c-s+p.a;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {p.a+p.c, p.b, 0. p.step+1};
                q.a=p.a+p.c;
                q.b=p.b;
                q.c=0;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.c>n-p.b)//也就是说p.c 还有剩余
            {
                //q= (MAZE) {p.a, n, p.c+p.b-n, p.step+1};
                q.a=p.a;
                q.b=n;
                q.c=p.c+p.b-n;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE){p.a, p.b+p.c, 0, p.step+1};
                q.a=p.a;
                q.b=p.b+p.c;
                q.c=0;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
    }
    printf("NO\n");
}
 
posted @ 2015-07-21 13:47  花开须臾  阅读(164)  评论(0编辑  收藏  举报