POJ 3414(Pots)

/*简单BFS
Author: shaorui
Date: 2012/9/29
思路简单,就是写起来有点麻烦
思路:用kind[i][j]表示1,2pots中剩的体积为i,j时,从
上一步到这步的操作种类。。。
11:FILL(1)
12:FILL(2)
21:DROP(1)
22: DROP(2)
31: POUR(1,2)
32: POUR(2,1)
prex[i][j],pery[i][j]表示1,2pots中剩的体积为i,j时,
上一步的x,y(即1,2pots中的体积x,y)
*/
#include<iostream>
#include<queue>
using namespace std;
#define maxn 101
struct node
{
    int x,y,t;
};
int a,b,c,endx,endy,dx,dy;
int prex[maxn][maxn],prey[maxn][maxn],kind[maxn][maxn];
bool visited[maxn][maxn];
bool BFS()
{
    queue<node> q;
    node s;
    s.x = s.y = s.t = 0;
    q.push(s);
    memset(visited,false,sizeof(visited));
    visited[0][0] = true;
    prex[0][0] = prey[0][0] = 0,kind[0][0] = 0;
    while(!q.empty())
    {
        node temp = q.front();
        q.pop();
        node next;
        if(!visited[a][temp.y])    //operate 1  FILL(1)
        {
            kind[a][temp.y] = 11;
            prex[a][temp.y] = temp.x,prey[a][temp.y] = temp.y;
            if(a == c)
            {
                printf("%d\n",temp.t+1);
                endx = a,endy = temp.y;
                return 1;
            }
            else
            {
                next.x = a,next.y = temp.y,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        if(!visited[temp.x][b])       //operate 1  FILL(2)
        {
            kind[temp.x][b] = 12;
            prex[temp.x][b] = temp.x,prey[temp.x][b] = temp.y;
            if(b == c)
            {
                printf("%d\n",temp.t+1);
                endx = temp.x,endy = b;
                return 1;
            }
            else
            {
                next.x = temp.x,next.y = b,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        if(!visited[0][temp.y])            //operate 2, DROP(1)
        {
            kind[0][temp.y] = 21;
            prex[0][temp.y] = temp.x,prey[0][temp.y] = temp.y;
            if(c == 0)
            {
                printf("%d\n",temp.t+1);
                endx = 0,endy = temp.y;
                return 1;
            }
            else
            {
                next.x = 0,next.y = temp.y,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        if(!visited[temp.x][0])           //operate 2, DROP(2)
        {
            kind[temp.x][0] = 22;
            prex[temp.x][0] = temp.x,prey[temp.x][0] = temp.y;
            if(c == 0)
            {
                printf("%d\n",temp.t+1);
                endx = temp.x,endy = 0;
                return 1;
            }
            else
            {
                next.x = temp.x,next.y = 0,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }    
        }
        next.y = temp.x+temp.y;          //operate 3   DROP(1,2)
        if(next.y <= b)
        {
            if(next.y == c)
            {
                kind[0][next.y] = 31;
                prex[0][next.y] = temp.x,prey[0][next.y] = temp.y;
                printf("%d\n",temp.t+1);
                endx = 0,endy = next.y;
                return 1;
            }
            else if(!visited[0][next.y])
            {
                kind[0][next.y] = 31;
                prex[0][next.y] = temp.x,prey[0][next.y] = temp.y;
                next.x = 0,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        else
        {
            if(next.y - b == c)
            {
                kind[next.y-b][b] = 31;
                prex[next.y-b][b] = temp.x,prey[next.y-b][b] = temp.y;
                printf("%d\n",temp.t+1);
                endx = next.y-b,endy = b;
                return 1;
            }
            else if(!visited[next.y-b][b])
            {
                kind[next.y-b][b] = 31;
                prex[next.y-b][b] = temp.x,prey[next.y-b][b] = temp.y;
                next.x = next.y-b,next.y = b,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        next.x = temp.x + temp.y;          //operate 3   DROP(1,2)
        if(next.x <= a)
        {
            if(next.x == c)
            {
                kind[next.x][0] = 32;
                prex[next.x][0] = temp.x,prey[next.x][0] = temp.y;
                printf("%d\n",temp.t+1);
                endx = next.x,endy = 0;
                return 1;
            }
            else if(!visited[next.x][0])
            {
                kind[next.x][0] = 32;
                prex[next.x][0] = temp.x,prey[next.x][0] = temp.y;
                next.y = 0,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
        else
        {
            if(next.x - a == c)
            {
                kind[a][next.x-a] = 32;
                prex[a][next.x-a] = temp.x,prey[a][next.x-a] = temp.y;
                printf("%d\n",temp.t+1);
                endx = a,endy = next.x-a;
                return 1;
            }
            else if(!visited[a][next.x-a])
            {
                kind[a][next.x-a] = 32;
                prex[a][next.x-a] = temp.x,prey[a][next.x-a] = temp.y;
                next.y = next.x - a,next.x = a,next.t = temp.t+1;
                q.push(next),visited[next.x][next.y] = true;
            }
        }
    }
    return 0;                      
}
void output()                         //输出操作过程
{
    if(endx == 0 && endy == 0)
        return;
    if(kind[endx][endy] == 11)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("FILL(1)\n");
    }
    else if(kind[endx][endy] == 12)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("FILL(2)\n");
    }
    else if(kind[endx][endy] == 21)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("DROP(1)\n");
    }
    else if(kind[endx][endy] == 22)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("DROP(2)\n");
    }
    else if(kind[endx][endy] == 31)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("POUR(1,2)\n");
    }
    else if(kind[endx][endy] == 32)
    {
        dx = prex[endx][endy],dy = prey[endx][endy];
        endx = dx,endy = dy;
        output();
        printf("POUR(2,1)\n");
    }
}
int main()
{
    //freopen("3414.txt","r",stdin);
    int i,j;
    while(scanf("%d%d%d",&a,&b,&c) != EOF)
    {
        if(BFS())
            output();
        else
            printf("impossible\n");
    }
    return 0;
}

 

 

posted @ 2012-09-29 10:04  sorryhao  阅读(782)  评论(0)    收藏  举报