1. 程式人生 > >poj 3414( 搜尋 )

poj 3414( 搜尋 )

#include <stdio.h>
#include <string.h>
#define N 101

struct Way {
    int prex;
    int prey;
    int kind;
} way[N][N];
struct Point{
    int x;
    int y;
} queue[N*N*2],c,r;

int answer[N*N];
int index = -1;
int visit[N][N];
int va,vb,vc;

void show(){
    int i;
    char temp[6][10] = { "FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
    printf("%d\n",index+1);
    for( i = index; i >= 0; i-- ){
        printf("%s\n",temp[answer[i]]);
    }
}

int bfs(){
    int top = 0, end = 0, i;
    index = -1;
    memset(visit,0,sizeof(visit));
    visit[0][0] = 1;
    queue[0].x = 0;
    queue[0].y = 0;

    while(top <= end){
        c = queue[top];
        for( i = 0; i < 6; i++){
            switch( i ){
                case 0: r.x = va; r.y = c.y;      break; //fill 1
                case 1: r.x = c.x; r.y = vb;      break; //fill 2
                case 2: r.x = 0; r.y = c.y;       break; //drop 1
                case 3: r.x = c.x; r.y = 0;       break; //drop 2
                case 4:                                  //pour 1 2
                        if( c.x + c.y <= vb) {
                            r.x = 0;
                            r.y = c.x + c.y;
                        } else {
                            r.x = c.x - (vb - c.y);
                            r.y = vb;
                        }
                        break;
                case 5:                                  //pour 2 1
                        if( c.x + c.y <= va){
                            r.x = c.x + c.y;
                            r.y = 0;
                        } else {
                            r.x = va;
                            r.y = c.y - (va - c.x);
                        }

                        break;
            }
            if( visit[r.x][r.y] == 0){
                if( r.x == vc || r.y == vc){
                    answer[++index] = i;
                    int nx = c.x;
                    int ny = c.y;
                    int prex,prey;
                    while( nx != 0 || ny != 0){
                        answer[++index] = way[nx][ny].kind;
                        prex = way[nx][ny].prex;
                        prey = way[nx][ny].prey;
                        nx = prex;
                        ny = prey;
                    }
                    return 1;
                } else {
                    visit[r.x][r.y] = 1;
                    queue[++end] = r;
                    way[r.x][r.y].prex = c.x;
                    way[r.x][r.y].prey = c.y;
                    way[r.x][r.y].kind = i;
                }
            }
        }
        top++;
    }
    return -1;
}


int main()
{
    while(scanf("%d%d%d",&va,&vb,&vc) != EOF){
        if(bfs() == -1){
            printf("impossible\n");
        } else {
            show();
        }
    }

    return 0;
}