非常可乐
time limit per test 1 second memory limit per test 256 megabytes
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出”NO”。

传送门:HDU1495

Input

三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。

Output

如果能平分的话请输出最少要倒的次数,否则输出"NO"。

Sample Input

1
2
3
7 4 3
4 1 3
0 0 0

Sample Output

1
2
NO
3

题解

简单bfs 主要是分清楚情况的讨论其只需要用二维记录状态即可
## AC code:(不包含输入类)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import java.io.*;  
import java.util.*;
public class Main {
static boolean [][]used;
static int ss,n,m;
public static void main(String[] args) {
FastScanner sc=new FastScanner();
PrintWriter pw=new PrintWriter(System.out);
while(sc.hasNext()){
ss=sc.nextInt();
n=sc.nextInt();
m=sc.nextInt();
if(ss==0&&n==0&&m==0)break;
used=new boolean[n+1][m+1];
if(ss%2!=0){
pw.println("NO");
}else{
int t=bfs(ss,0,0);
if(t==-1)pw.println("NO");
else pw.println(t);
}
pw.flush();
}

}
static int bfs(int s,int a,int b){
Queue<Num>queue=new LinkedList<Num>();
used[a][b]=true;
queue.add(new Num(s,a,b,0));
while(!queue.isEmpty()){
Num t=queue.poll();
//System.out.println(t.s+" "+t.a+" "+t.b);
if((t.b==ss/2&&t.a==0)||(t.a==ss/2&&t.b==0)||(t.a==ss/2&&t.s==0)) return t.bs;
//s->a
int sa=t.s+t.a;
int dao=0;
if(sa<=n){
dao=t.s;
}else{
dao=n-t.a;
}
if(!used[t.a+dao][t.b]){
queue.add(new Num(t.s-dao,t.a+dao,t.b,t.bs+1));
used[t.a+dao][t.b]=true;
}
//s->b
int sb=t.s+t.b;
dao=0;
if(sb<=m){
dao=t.s;
}else{
dao=m-t.b;
}
if(!used[t.a][t.b+dao]){
queue.add(new Num(t.s-dao,t.a,t.b+dao,t.bs+1));
used[t.a][t.b+dao]=true;
}
//a->s
int as=t.s+t.a;
dao=0;
if(as<=ss){
dao=t.a;
}else{
dao=ss-t.s;
}
if(!used[t.a-dao][t.b]){
queue.add(new Num(t.s+dao,t.a-dao,t.b,t.bs+1));
used[t.a-dao][t.b]=true;
}
//b->s
int bs=t.s+t.b;
dao=0;
if(bs<=ss){
dao=t.b;
}else{
dao=ss-t.s;
}
if(!used[t.a][t.b-dao]){
queue.add(new Num(t.s+dao,t.a,t.b-dao,t.bs+1));
used[t.a][t.b-dao]=true;
}
//a->b
int ab=t.a+t.b;
dao=0;
if(ab<=m){
dao=t.a;
}else{
dao=m-t.b;
}
if(!used[t.a-dao][t.b+dao]){
queue.add(new Num(t.s,t.a-dao,t.b+dao,t.bs+1));
used[t.a-dao][t.b+dao]=true;
}
//b->a
int ba=t.a+t.b;
dao=0;
if(ba<=n){
dao=t.b;
}else{
dao=n-t.a;
}
if(!used[t.a+dao][t.b-dao]){
queue.add(new Num(t.s,t.a+dao,t.b-dao,t.bs+1));
used[t.a+dao][t.b-dao]=true;
}
}
return -1;
}
}
class Num{
int s,a,b,bs;
Num(int s,int a,int b,int bs){
this.s=s;
this.a=a;
this.b=b;
this.bs=bs;
}
}