zoukankan      html  css  js  c++  java
  • 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 }


     

  • 相关阅读:
    解决asp.net mvc的跨域请求问题
    centos安装nodejs
    webapi中配置返回的时间数据格式
    centos安装django
    在Linux CentOS 6.6上安装Python 2.7.9
    nginx日志切割脚本
    apache单ip配置多端口多站点
    centos开启rewrite功能
    Fast Matrix Operations
    1400
  • 原文地址:https://www.cnblogs.com/lfeng/p/3000018.html
Copyright © 2011-2022 走看看