poj 3414( 搜尋 )
阿新 • • 發佈:2019-02-14
#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; }