7 4 3 4 1 3 0 0 0
NO 3
原来怎么没发现是个bfs。。。。。。。
总共六次倒水情况 S->N S->M N->S N->M M->S M->N;
分别考虑每种情况 然后把这种情况记录下来 然后由于广搜之后的情况记录下来。。。就是BFS的思想 中间实现过程有点繁琐。。。记得清空队列 或者把队列放到函数里面
#include <stdio.h> #include <string.h> #include <algorithm> #include <queue> using namespace std; struct node{ int a; int b; int c; int t; }; int S,N,M; bool used[110][110][110]; int bfs() { queue<node> Q; used[S][0][0]=true; Q.push((node){S,0,0,0}); while(!Q.empty()) { node q=Q.front(); Q.pop(); if((q.a==S/2&&q.b==S/2)||(q.a==S/2&&q.c==S/2)||(q.b==S/2&&q.c==S/2)) { return q.t; } if(q.a!=0) { if(q.b<N) { if(q.a>(N-q.b)) { if(!used[q.a-(N-q.b)][N][q.c]) { used[q.a-(N-q.b)][N][q.c]=true; Q.push((node){q.a-(N-q.b),N,q.c,q.t+1}); } } else { if(!used[0][q.b+q.a][q.c]) { used[0][q.b+q.a][q.c]=true; Q.push((node){0,q.b+q.a,q.c,q.t+1}); } } } if(q.c<M) { if(q.a>(M-q.c)) { if(!used[q.a-(M-q.c)][q.b][M]) { used[q.a-(M-q.c)][q.b][M]=true; Q.push((node){q.a-(M-q.c),q.b,M,q.t+1}); } } else { if(!used[0][q.b][q.a+q.c]) { used[0][q.b][q.a+q.c]=true; Q.push((node){0,q.b,q.a+q.c,q.t+1}); } } } } if(q.b!=0) { if(q.a<S) { if(q.b>S-q.a) { if(!used[S][q.b-(S-q.a)][q.c]) { used[S][q.b-(S-q.a)][q.c]=true; Q.push((node){S,q.b-(S-q.a),q.c,q.t+1}); } } else { if(!used[q.a+q.b][0][q.c]) { used[q.a+q.b][0][q.c]=true; Q.push((node){q.a+q.b,0,q.c,q.t+1}); } } } if(q.c<M) { if(q.b>(M-q.c)) { if(!used[q.a][q.b-(M-q.c)][M]) { used[q.a][q.b-(M-q.c)][M]=true; Q.push((node){q.a,q.b-(M-q.c),M,q.t+1}); } } else { if(!used[q.a][0][q.b+q.c]) { used[q.a][0][q.b+q.c]=true; Q.push((node){q.a,0,q.b+q.c,q.t+1}); } } } } if(q.c!=0) { if(q.a<S) { if(q.c>S-q.a) { if(!used[S][q.b][q.c-(S-q.a)]) { used[S][q.b][q.c-(S-q.a)]=true; Q.push((node){S,q.b,q.c-(S-q.a),q.t+1}); } } else { if(!used[q.a+q.c][q.b][0]) { used[q.a+q.c][q.b][0]=true; Q.push((node){q.a+q.c,q.b,0,q.t+1}); } } } if(q.b<N) { if(q.c>(N-q.b)) { if(!used[q.a][N][q.c-(N-q.b)]) { used[q.a][N][q.c-(N-q.b)]=true; Q.push((node){q.a,N,q.c-(N-q.b),q.t+1}); } } else { if(!used[q.a][q.b+q.c][0]) { used[q.a][q.b+q.c][0]=true; Q.push((node){q.a,q.b+q.c,0,q.t+1}); } } } } } return -1; } int main() { while(scanf("%d%d%d",&S,&N,&M)!=EOF) { memset(used,false,sizeof(used)); if(S==0&&N==0&&M==0) break; if(S&1) { printf("NO\n"); continue; } int ans=bfs(); if(ans==-1) { printf("NO\n"); } else { printf("%d\n",ans); } } return 0; }