#include <cstdio>#include<queue>#include<cstring>using namespacestd;structpoint{intb; intstep; intway[ the];};intaa,bb,cc;intv[ the][ the];voidBFs () {memset (V,0,sizeof(v)); Queue<point>que; Point Now,next; NOW.A=0; NOW.B=0; Now.step=0; v[0][0]=true; Que.push (now); while(!Que.empty ()) { Now=Que.front (); Que.pop (); if(NOW.A==CC | | now.b==cc) {printf ("%d\n", Now.step); for(intI=1; i<=now.step;i++) { if(now.way[i]==1) printf ("FILL (1) \ n"); if(now.way[i]==2) printf ("FILL (2) \ n"); if(now.way[i]==3) printf ("DROP (1) \ n"); if(now.way[i]==4) printf ("DROP (2) \ n"); if(now.way[i]==5) printf ("pour () \ n"); if(now.way[i]==6) printf ("pour (2,1) \ n"); } return ; } //FILL A 111111111 if(now.a!=AA) {Next=Now ; NEXT.A=AA; next.b=now.b; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=1; Que.push (next); } } //FILL B 2222222222 if(now.b!=b) {Next=Now ; NEXT.A=NOW.A; next.b=BB; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=2; Que.push (next); } } //DROP A 3333333333 if(now.a!=0) {Next=Now ; NEXT.A=0; next.b=now.b; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=3; Que.push (next); } } //DROP B 444444444444 if(now.b!=0) {Next=Now ; NEXT.A=NOW.A; next.b=0; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=4; Que.push (next); } } //pour (5555555555555) if(now.a!=0) { if(NOW.A>=BB-NOW.B)//a pour full b{Next=Now ; NEXT.A=now.a-(bb-now.b); next.b=b; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=5; Que.push (next); } }Else if(NOW.A<BB-NOW.B)//a empty, not full of B.{Next=Now ; NEXT.A=0; next.b=now.b+NOW.A; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=5; Que.push (next); } } } //pour (2,1) 6666666666666 if(now.b!=0) { if(now.b>=aa-now.a) {Next=Now ; NEXT.A=AA; next.b=now.b-(aa-NOW.A); if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=6; Que.push (next); } }Else if(now.b<aa-now.a) {Next=Now ; NEXT.A=now.a+now.b; next.b=0; if(!v[next.a][next.b]) {v[next.a][next.b]=1; Next.step=now.step+1; Next.way[next.step]=6; Que.push (next); } }}} printf ("impossible\n");}intMain () {scanf ("%d%d%d",&aa,&bb,&cc); BFS (); return 0;}
Bfs/poj 3414 Pots