POJ 3414 Pots
这个题是个BFS加了一点难度的题。
需要保存前一节点的在队列中的位置,操作等……
下面是代码:
#include <stdio.h> #include <string.h> int a,b,c; bool vis[105][105]; struct node { int x,y,pr; char s[10]; } qu[15000],du,dc; char c1[10000][10]; int main() { while(scanf("%d%d%d",&a,&b,&c)!=EOF) { memset(qu,0,sizeof(qu)); memset(vis,0,sizeof(vis)); int l=0,r=0,cut=0; du.x=0; du.y=0; du.pr=-1; strcpy(du.s,"begin"); qu[r]=du; r++; vis[0][0]=1; int flat=0; while(l!=r) { du=qu[l]; if(du.x==c||du.y==c) { flat=1; break; } if(du.x<a&&!vis[a][du.y]) { vis[a][du.y]=1; dc.x=a; dc.y=du.y; dc.pr=l; strcpy(dc.s,"FILL(1)"); qu[r]=dc; r++; } if(du.y<b&&!vis[du.x][b]) { vis[du.x][b]=1; dc.x=du.x; dc.y=b; dc.pr=l; strcpy(dc.s,"FILL(2)"); qu[r]=dc; r++; } if(du.x+du.y<=a&&!vis[du.x+du.y][0]) { vis[du.x+du.y][0]=1; dc.x=du.x+du.y; dc.y=0; dc.pr=l; strcpy(dc.s,"POUR(2,1)"); qu[r]=dc; r++; } if(du.y-a+du.x>0&&!vis[a][du.y-a+du.x]) { vis[a][du.y-a+du.x]=1; dc.x=a; dc.y=du.y-a+du.x; dc.pr=l; strcpy(dc.s,"POUR(2,1)"); qu[r]=dc; r++; } if(du.x+du.y<=b&&!vis[0][du.x+du.y]) { vis[0][du.x+du.y]=1; dc.y=du.x+du.y; dc.x=0; dc.pr=l; strcpy(dc.s,"POUR(1,2)"); qu[r]=dc; r++; } if(du.x-b+du.y>0&&!vis[du.x-b+du.y][b]) { vis[du.x-b+du.y][b]=1; dc.y=b; dc.x=du.x-b+du.y; dc.pr=l; strcpy(dc.s,"POUR(1,2)"); qu[r]=dc; r++; } if(du.x!=0&&!vis[0][du.y]) { vis[0][du.y]=1; dc.x=0; dc.y=du.y; dc.pr=l; strcpy(dc.s,"DROP(1)"); qu[r]=dc; r++; } if(du.y!=0&&!vis[du.x][0]) { vis[du.y][0]=1; dc.y=0; dc.x=du.x; dc.pr=l; strcpy(dc.s,"DROP(2)"); qu[r]=dc; r++; } l++; } if(flat) { int a; strcpy(c1[cut],du.s); a=du.pr; cut++; while(a!=-1) { du=qu[a]; strcpy(c1[cut],du.s); a=du.pr; cut++; } printf("%d\n",cut-1); for(int i=cut-2;i>=0;i--) { puts(c1[i]); } } else { printf("impossible\n"); } } return 0; }