• hdu 1495 非常可乐 (bfs)


    非常可乐

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 4142    Accepted Submission(s): 1691


    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   |   We have carefully selected several similar problems for you:  1175 1072 1180 1026 1254 
     
     1 //203MS    4880K    2201 B    G++
     2 /*
     3 
     4     题意:
     5         互倒可乐,是否可以平分
     6     
     7     BFS:
     8         比较基本的bfs,难点在状态分析,每一步可以有六种走法,直接暴力即可,
     9     然后用vis数组来标记重复的,以免TLE。 
    10 
    11 */
    12 #include<iostream>
    13 #include<queue>
    14 using namespace std;
    15 struct node{
    16     int s,n,m;
    17     int step;
    18 };
    19 int vis[105][105][105];
    20 int bfs(int s,int n,int m)
    21 {
    22     memset(vis,0,sizeof(vis));
    23     vis[s][0][0]=1;
    24     node t={s,0,0,0};
    25     queue<node>Q;
    26     Q.push(t);
    27     while(!Q.empty()){
    28         t=Q.front();
    29         Q.pop();
    30         //printf("%d %d %d
    ",t.s,t.n,t.m);
    31         if(t.s==t.n && t.m==0) return t.step;
    32         t.step++;
    33         if(s-t.s>t.n && !vis[t.s+t.n][0][t.m]){
    34             node tt=t;
    35             tt.s=t.s+t.n;tt.n=0;vis[tt.s][0][tt.m]=1;
    36             Q.push(tt);        
    37         }
    38         if(s-t.s>t.m && !vis[t.s+t.m][t.n][0]){
    39             node tt=t;
    40             tt.s=t.s+t.m;tt.m=0;vis[tt.s][tt.n][0]=1;
    41             Q.push(tt);
    42         }
    43         if(n-t.n<=t.s && !vis[t.s-(n-t.n)][n][t.m]){
    44             node tt=t;
    45             tt.s-=(n-t.n);tt.n=n;vis[tt.s][tt.n][tt.m]=1;
    46             Q.push(tt);
    47         }
    48         if(n-t.n>t.m && !vis[t.s][t.n+t.m][0]){
    49             node tt=t;
    50             tt.n+=t.m;tt.m=0;vis[tt.s][tt.n][0]=1;
    51             Q.push(tt);
    52         }else if(n-t.n<=t.m && !vis[t.s][n][t.m-(n-t.n)]){
    53             node tt=t;
    54             tt.n=n;tt.m-=(n-t.n);vis[tt.s][tt.n][tt.m]=1;
    55             Q.push(tt);
    56         }
    57         if(m-t.m<=t.s && !vis[t.s-(m-t.m)][t.n][m]){
    58             node tt=t;
    59             tt.m=m;tt.s-=(m-t.m);vis[tt.s][tt.n][m]=1;
    60             Q.push(tt);
    61         }
    62         if(m-t.m>t.n && !vis[t.s][0][t.m+t.n]){
    63             node tt=t;
    64             tt.n=0;tt.m+=t.n;vis[tt.s][0][tt.m]=1;
    65             Q.push(tt);
    66         }else if(m-t.m<=t.n && !vis[t.s][t.n-(m-t.m)][m]){
    67             node tt=t;
    68             tt.n-=(m-t.m);tt.m=m;vis[tt.s][tt.n][tt.m]=1;
    69             Q.push(tt);
    70         }
    71     } 
    72     return 0;
    73 }
    74 int main(void) 
    75 {
    76     int s,n,m;
    77     while(scanf("%d%d%d",&s,&n,&m),s+n+m)
    78     {
    79         if(s&1){
    80             puts("NO");continue;
    81         }
    82         if(n==m){
    83             puts("1");continue;
    84         }
    85         if(m>n){
    86             int t=m;m=n;n=t;
    87         }
    88         int ans=bfs(s,n,m);
    89         if(ans) printf("%d
    ",ans);
    90         else puts("NO");
    91     }
    92     return 0;
    93 }
  • 相关阅读:
    win10下安装为知笔记的markdown插件
    最近一段时间的工作状态
    C++中的取余与取模
    来新项目后,最心虚的一个夜晚
    g++添加支持c++11的选项
    Linux ssh远程登陆方式:密码与公钥
    判断脚本加载完成
    解决ie6下最小高度问题
    display:inline-block的深入理解
    ff下button按钮上的文字垂直居中
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3615678.html
Copyright © 2020-2023  润新知