http://acm.hdu.edu.cn/showproblem.php?pid=1495
bfs,个人感觉很经典的题目,分六种情况搜索

#include <iostream> using namespace std ; int s,n,m ; int q[101*101*101][3] ; int dp[101][101][101] ; int bfs() { if(s&1) return 0 ; if(n<(s>>1)) return 0 ; dp[s][0][0]=0 ; int front=0,rear=1 ; q[front][0]=s ,q[front][1]=0 ,q[front][2]=0 ; while(front<rear) { int x,y,z ; int xx,yy,zz ; int pour ; x=q[front][0] ,y=q[front][1] ,z=q[front][2] ; front++ ; //s->n if(x!=0 && y!=n) { pour=min(x,n-y) ; xx=x-pour ; yy=y+pour ; zz=z ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } //s->m if(x!=0 && z!=m) { pour=min(x,m-z) ; xx=x-pour ; yy=y ; zz=z+pour ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } //n->s if(y!=0 && x!=s) { pour=min(y,s-x) ; xx=x+pour ; yy=y-pour ; zz=z ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } //n->m if(y!=0 && z!=m) { pour=min(y,m-z) ; xx=x ; yy=y-pour ; zz=z+pour ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } //m->s if(z!=0 && x!=s) { pour=min(z,s-x) ; xx=x+pour ; yy=y ; zz=z-pour ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } //m->n if(z!=0 && y!=n) { pour=min(z,n-y) ; xx=x ; yy=y+pour ; zz=z-pour ; if(dp[xx][yy][zz]==-1) { dp[xx][yy][zz]=dp[x][y][z]+1 ; q[rear][0]=xx ,q[rear][1]=yy ,q[rear][2]=zz ; rear++ ; } } } return dp[s>>1][s>>1][0] ; } int main() { while(scanf("%d%d%d",&s,&n,&m),(s||n||m)) { if(n<m) n^=m^=n^=m ; memset(dp,-1,sizeof(dp)) ; int ans=bfs() ; if(ans<=0) puts("NO") ; else printf("%d\n",ans) ; } return 0 ; }