//BFS,二维状态空间,并且需要打印出得到目标状态的路径. //使用DFS搜索路径,BFS查找最短路径长度 //主要考虑每个节点有六种可能即分支,广度搜索,直到有一只pot中剩有目标数量的水 /停止,若最后f[][]中c行或c列中所有值均为0,即没有变化,则说明,由a和b不能"扩展" 到c所在的节点,答案就是impossible。 #include<stdio.h> #include<string.h> #include<queue> using namespace std; int f[105][105]; int ans[10000]; queue<int> q; int a,b,c,ends; int dfs(int m,int n,int l,int k)///DFS搜索路径 { { int i,t1,t2; for(i=1;i<=6;i++) { t1=m;t2=n; if(i==1) t1=a; else if(i==2) t2=b; else if(i==3) t1=0; else if(i==4) t2=0; else if(i==5) { if(m<b-n) { t1=0; t2=m+n; } else { t1=m-(b-n); t2=b; } } else { if(n<a-m) { t1=m+n; t2=0; } else { t1=a; t2=n-(a-m); } } if(f[t1][t2]==0) continue; if(t1==c||t2==c) { ans[l]=i; ends=1; return 0; } if(f[t1][t2]==l+1&&!ends) { ans[l]=i; dfs(t1,t2,l+1,k); } if(ends==1) return 0; } } } int pr(int k) { int i; for(i=0;i<k;i++) { switch(ans[i]) {case 1: printf("FILL(1)/n");break; case 2: printf("FILL(2)/n");break; case 3: printf("DROP(1)/n");break; case 4: printf("DROP(2)/n");break; case 5: printf("POUR(1,2)/n");break; case 6: printf("POUR(2,1)/n");break; } } return 0; } int bfs(int m,int n) { memset(f,0,sizeof(f)); q.push(m); q.push(n); while(!q.empty()) { int x,y,i,t1,t2; x=q.front();q.pop(); y=q.front();q.pop(); for(i=1;i<=6;i++) { t1=x;t2=y; if(i==1) t1=a; else if(i==2) t2=b; else if(i==3) t1=0; else if(i==4) t2=0; else if(i==5) { if(x<b-y) { t1=0; t2=y+x; } else { t1=x-(b-y); t2=b; } } else { if(y<a-x) { t1=x+y; t2=0; } else { t1=a; t2=y-(a-x); } } if(t1==x&&t2==y) continue; if(f[t1][t2]!=0) continue; f[t1][t2]=f[x][y]+1; if(t1==c||t2==c) return 0; q.push(t1); q.push(t2); } } return 0; } int main() { scanf("%d%d%d",&a,&b,&c); bfs(0,0); int i,j; ends=0; for(i=0;i<=a;i++) { if(f[i][c]!=0) { printf("%d/n",f[i][c]); dfs(0,0,0,f[i][c]); ///printf("---%d/n",ans[0]); pr(f[i][c]); return 0; } } for(i=0;i<=b;i++) { if(f[c][i]!=0) { printf("%d/n",f[c][i]); dfs(0,0,0,f[c][i]); pr(f[c][i]); return 0; } } printf("impossible/n"); return 0; }