HDU 1495 非常可乐(简单BFS)

非常可乐

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2934    Accepted Submission(s): 1182
Problem Description
大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为。因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多。但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的次数,如果不能输出"NO"。
 
Input
三个整数 : S 可乐的体积 , N 和 M是两个杯子的容量,以"0 0 0"结束。
 
Output
如果能平分的话请输出最少要倒的次数,否则输出"NO"。
 
Sample Input
7 4 3 4 1 3 0 0 0
 
Sample Output
NO 3
 
Author
seeyou
 
Source
 
Recommend
LL
 
简单搜索题。。可惜因为一个小小的错误WA了几次,囧囧。。。。。
 
View Code
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<queue>
 4 using namespace std;
 5 struct node
 6 {
 7     int boom[3];
 8     int time;
 9 };
10 int vis[102][102][102];
11 int ma[3];
12 int check(node p)
13 {
14     int i;
15     for(i = 0; i < 3; i++)
16         if(p.boom[i] < 0 && p.boom[i] > ma[i])return 0;
17     if(vis[p.boom[0]][p.boom[1]][p.boom[2]])return 0;
18     return 1;
19 }
20 void bfs()
21 {
22     queue<node>q;
23     node p, s;
24     int i, j;
25     memset(vis, 0, sizeof(vis));
26     memset(p.boom, 0, sizeof(p.boom));
27     p.boom[0] = ma[0];
28     p.time = 0;
29     vis[ma[0]][0][0] = 1;
30     q.push(p);
31     while(!q.empty())
32     {
33         p = q.front();
34         q.pop();
35         if((p.boom[0] == p.boom[1] && !p.boom[2]) || (p.boom[1] == p.boom[2] && !p.boom[0]) || (p.boom[0] == p.boom[2] && !p.boom[1]))
36         {
37             printf("%d\n", p.time);
38             return ;
39         }
40         for(i = 0; i < 3; i++)
41             for(j = 0; j < 3; j++)
42             {
43                 s = p;
44                 if(i == j)continue;
45                 if(s.boom[i] + s.boom[j] >= ma[j])
46                 {
47                     s.boom[i] -= ma[j] - s.boom[j];
48                     s.boom[j] = ma[j];
49                 }
50                 else
51                 {
52                     s.boom[j] += s.boom[i];
53                     s.boom[i] = 0;
54                 }
55                 if(vis[s.boom[0]][s.boom[1]][s.boom[2]])continue;
56                 vis[s.boom[0]][s.boom[1]][s.boom[2]] = 1;
57                 s.time++;
58                 q.push(s);
59             }
60     }
61     printf("NO\n");
62 }
63 int main()
64 {
65     while(scanf("%d %d %d", &ma[0], &ma[1], &ma[2]) != EOF)
66     {
67         if(!ma[0] && !ma[1] && !ma[2])break;
68         if(ma[0] % 2 != 0)
69         {
70             printf("NO\n");
71             continue;
72         }
73         bfs();
74     }
75     return 0;
76 }

 

再贴个短一点的代码:
 
View Code
  1 #include<cstdio>
  2 #include<iostream>
  3 #include<queue>
  4 using namespace std;
  5 struct node
  6 {
  7     int x;
  8     int y;
  9     int z;
 10     int time;
 11 };
 12 int vis[102][102][102];
 13 int S, n, m;
 14 int check(node p)
 15 {
 16     if(p.x >= 0 && p.x <= n && p.y >= 0 && p.y <= m && p.z >= 0 && p.z <= S && !vis[p.x][p.y][p.z])return 1;
 17     return 0;
 18 }
 19 void bfs()
 20 {
 21     queue<node>q;
 22     node p, s;
 23     memset(vis, 0, sizeof(vis));
 24     p.x = p.y = p.time = 0;
 25     p.z = S;
 26     vis[0][0][S] = 1;
 27     q.push(p);
 28     while(!q.empty())
 29     {
 30         p = q.front();
 31         q.pop();
 32         s.time = p.time + 1;
 33         if((p.x == p.y && !p.z) || (p.x == p.z && !p.y) || (p.z == p.y && !p.x))
 34         {
 35             printf("%d\n", p.time);
 36             return ;
 37         }
 38         if(p.x + p.y >= m)//1到2
 39         {
 40             s.y = m;
 41             s.x = p.x - (m - p.y);
 42         }
 43         else
 44         {
 45             s.y = p.x + p.y;
 46             s.x = 0;
 47         }
 48         s.z = p.z;
 49         if(check(s))
 50         {
 51             vis[s.x][s.y][s.z] = 1;
 52             q.push(s);
 53         }
 54         if(p.x + p.y >= n)//2到1
 55         {
 56             s.x = n;
 57             s.y = p.y - (n - p.x);
 58         }
 59         else
 60         {
 61             s.x = p.x + p.y;
 62             s.y = 0;
 63         }
 64         s.z = p.z;
 65         if(check(s))
 66         {
 67             vis[s.x][s.y][s.z] = 1;
 68             q.push(s);
 69         }
 70         if(p.x + p.z >= n) //3到1
 71         {
 72             s.x = n;
 73             s.z = p.z - (n - p.x);
 74         }
 75         else
 76         {
 77             s.x = p.z + p.x;
 78             s.z = 0;
 79         }
 80         s.y = p.y;
 81         if(check(s))
 82         {
 83             vis[s.x][s.y][s.z] = 1;
 84             q.push(s);
 85         }
 86         if(p.x + p.z >= S)//1到3
 87         {
 88             s.z = S;
 89             s.x = p.x - (S - p.z);
 90         }
 91         else
 92         {
 93             s.z = p.x + p.z;
 94             s.x = 0;
 95         }
 96         s.y = p.y;
 97         if(check(s))
 98         {
 99             vis[s.x][s.y][s.z] = 1;
100             q.push(s);
101         }
102         if(p.y + p.z >= S)//2到3
103         {
104             s.z = S;
105             s.y = p.y - (S - p.z);
106         }
107         else
108         {
109             s.z = p.y + p.z;
110             s.y = 0;
111         }
112         s.x = p.x;
113         if(check(s))
114         {
115             vis[s.x][s.y][s.z] = 1;
116             q.push(s);
117         }
118         if(p.y + p.z >= m) //3到2
119         {
120             s.y = m;
121             s.z = p.z - (m - p.y);
122         }
123         else
124         {
125             s.y = p.z + p.y;
126             s.z = 0;
127         }
128         s.x = p.x;
129         if(check(s))
130         {
131             vis[s.x][s.y][s.z] = 1;
132             q.push(s);
133         }
134     }
135     printf("NO\n");
136 }
137 int main()
138 {
139     while(scanf("%d %d %d", &S, &n, &m) != EOF)
140     {
141         if(!S && !n && !m)break;
142         if(S % 2 != 0)
143         {
144             printf("NO\n");
145             continue;
146         }
147         bfs();
148     }
149     return 0;
150 }


 

posted @ 2013-04-04 22:43  LFENG  阅读(268)  评论(0编辑  收藏  举报