zoukankan      html  css  js  c++  java
  • 非常可乐(bfs)

    非常可乐

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

    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

    题解:没有初始化,错了半天。。。。。。我真是无语了;直接队列定义在bfs里面就行了

    代码1:

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<cmath>
      5 #include<algorithm>
      6 #include<queue>
      7 using namespace std;
      8 const int INF=0x3f3f3f3f;
      9 int S,M,N;
     10 int vis[110][110];
     11 struct Node{
     12     int s,m,n,step;
     13 };
     14 bool check(Node a){
     15     int x,y,z;
     16     x=a.s;y=a.m;z=a.n;
     17     int flot=0;
     18     if(!x)flot++;if(!y)flot++;if(!z)flot++;
     19     if(flot!=1)return false;
     20     flot=0;
     21     if(x)if(x*2==S)flot++;
     22     if(y)if(y*2==S)flot++;
     23     if(z)if(z*2==S)flot++;
     24     if(flot==2)return true;
     25     else return false;
     26 }
     27 void bfs(){
     28     Node a,b;
     29     memset(vis,0,sizeof(vis));
     30     queue<Node>dl;
     31     a.s=S;
     32     a.m=0;
     33     a.n=0;
     34     a.step=0;
     35     dl.push(a);
     36     vis[a.m][a.n]=1;
     37     while(!dl.empty()){
     38         a=dl.front();
     39         dl.pop();
     40         if(a.m<M){//s-m
     41             if(a.s>=M-a.m){
     42             b.s=a.s-(M-a.m);
     43             b.m=M;
     44             b.n=a.n;
     45             b.step=a.step+1;
     46             if(check(b)){
     47                 printf("%d
    ",b.step);
     48                 return;
     49             }
     50             if(!vis[b.m][b.n]){
     51                 vis[b.m][b.n]=1;
     52                 dl.push(b);
     53                 }
     54             }
     55             else{
     56                 b.m=a.m+a.s;
     57                 b.s=0;
     58                 b.n=a.n;
     59                 b.step=a.step+1;
     60                 if(check(b)){
     61                 printf("%d
    ",b.step);
     62                 return;
     63             }
     64             if(!vis[b.m][b.n]){
     65                 vis[b.m][b.n]=1;
     66                 dl.push(b);
     67                 }
     68             }
     69         }
     70         if(a.n<N){//s-n
     71             if(a.s>=N-a.n){
     72             b.s=a.s-(N-a.n);
     73             b.n=N;
     74             b.m=a.m;
     75             b.step=a.step+1;
     76             if(check(b)){
     77                 printf("%d
    ",b.step);
     78                 return;
     79             }
     80             if(!vis[b.m][b.n]){
     81                 vis[b.m][b.n]=1;
     82                 dl.push(b);
     83             }
     84             }
     85             else{
     86                 b.n=a.n+a.s;
     87                 b.s=0;
     88                 b.m=a.m;
     89                 b.step=a.step+1;
     90                 if(check(b)){
     91                 printf("%d
    ",b.step);
     92                 return;
     93             }
     94             if(!vis[b.m][b.n]){
     95                 vis[b.m][b.n]=1;
     96                 dl.push(b);
     97                 }
     98             }
     99         }
    100         if(a.s<S){//m-s
    101             if(a.m>=S-a.s){
    102             b.m=a.m-(S-a.s);
    103             b.s=S;
    104             b.n=a.n;
    105             b.step=a.step+1;
    106             if(check(b)){
    107                 printf("%d
    ",b.step);
    108                 return;
    109             }
    110             if(!vis[b.m][b.n]){
    111                 vis[b.m][b.n]=1;
    112                 dl.push(b);
    113             }
    114             }
    115             else{
    116                 b.s=a.s+a.m;
    117                 b.n=a.n;
    118                 b.m=0;
    119                 b.step=a.step+1;
    120                 if(check(b)){
    121                 printf("%d
    ",b.step);
    122                 return;
    123             }
    124             if(!vis[b.m][b.n]){
    125                 vis[b.m][b.n]=1;
    126                 dl.push(b);
    127                 }
    128             }
    129         }
    130         if(a.n<N){//m-n
    131             if(a.m>=N-a.n){
    132             b.m=a.m-(N-a.n);
    133             b.s=a.s;
    134             b.n=N;
    135             b.step=a.step+1;
    136             if(check(b)){
    137                 printf("%d
    ",b.step);
    138                 return;
    139             }
    140             if(!vis[b.m][b.n]){
    141                 vis[b.m][b.n]=1;
    142                 dl.push(b);
    143                 }
    144             }
    145             else{
    146                 b.n=a.n+a.m;
    147                 b.s=a.s;
    148                 b.m=0;
    149                 b.step=a.step+1;
    150                 if(check(b)){
    151                 printf("%d
    ",b.step);
    152                 return;
    153             }
    154             if(!vis[b.m][b.n]){
    155                 vis[b.m][b.n]=1;
    156                 dl.push(b);
    157                 }
    158             }
    159         }
    160         if(a.s<S){//n-s
    161             if(a.n>=S-a.s){
    162             b.n=a.n-(S-a.s);
    163             b.s=S;
    164             b.m=a.m;
    165             b.step=a.step+1;
    166             if(check(b)){
    167                 printf("%d
    ",b.step);
    168                 return;
    169             }
    170             if(!vis[b.m][b.n]){
    171                 vis[b.m][b.n]=1;
    172                 dl.push(b);
    173                 }
    174             }
    175             else{
    176                 b.s=a.s+a.n;
    177                 b.m=a.m;
    178                 b.n=0;
    179                 b.step=a.step+1;
    180                 if(check(b)){
    181                 printf("%d
    ",b.step);
    182                 return;
    183             }
    184             if(!vis[b.m][b.n]){
    185                 vis[b.m][b.n]=1;
    186                 dl.push(b);
    187                 }
    188             }
    189         }
    190         if(a.m<M){//n-m
    191         if(a.n>=M-a.m){
    192             b.n=a.n-(M-a.m);
    193             b.s=a.s;
    194             b.m=M;
    195             b.step=a.step+1;
    196             if(check(b)){
    197                 printf("%d
    ",b.step);
    198                 return;
    199             }
    200             if(!vis[b.m][b.n]){
    201                 vis[b.m][b.n]=1;
    202                 dl.push(b);
    203             }
    204             }
    205         else{
    206                 b.m=a.m+a.n;
    207                 b.s=a.s;
    208                 b.n=0;
    209                 b.step=a.step+1;
    210                 if(check(b)){
    211                 printf("%d
    ",b.step);
    212                 return;
    213             }
    214             if(!vis[b.m][b.n]){
    215                 vis[b.m][b.n]=1;
    216                 dl.push(b);
    217                 }
    218             }
    219         }
    220     }
    221     puts("NO");
    222 }
    223 int main(){
    224     while(~scanf("%d%d%d",&S,&M,&N),S|M|N){
    225         if(S&1)puts("NO");
    226         else bfs();
    227     }
    228     return 0;}

    代码2:

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cmath>
     5 #include<algorithm>
     6 #include<queue>
     7 using namespace std;
     8 const int INF=0x3f3f3f3f;
     9 int c[3];
    10 int vis[110][110];
    11 struct Node{
    12     int v[3],step;
    13 };
    14 bool check(Node a){
    15     int x,y,z;
    16     x=a.v[0];y=a.v[1];z=a.v[2];
    17     int t=c[0]/2;
    18     //printf("%d %d %d %d
    ",x,y,z,t);
    19     if(x==t&&y==t)return true;
    20     if(y==t&&z==t)return true;
    21     if(x==t&&z==t)return true;
    22     return false;
    23 }
    24 void bfs(){
    25     Node a,b;
    26     memset(vis,0,sizeof(vis));
    27     queue<Node>dl;
    28     a.v[0]=c[0];
    29     a.v[1]=0;
    30     a.v[2]=0;
    31     a.step=0;
    32     dl.push(a);
    33     vis[a.v[1]][a.v[2]]=1;
    34     while(!dl.empty()){
    35         a=dl.front();
    36         dl.pop();
    37         for(int i=0;i<3;i++)
    38         for(int j=0;j<3;j++){
    39             if(i==j)continue;
    40             b=a;
    41             b.step=a.step+1;
    42             if(b.v[i]>=c[j]-b.v[j]){
    43                 b.v[i]=b.v[i]-(c[j]-b.v[j]);
    44                 b.v[j]=c[j];
    45             }
    46             else{
    47                 b.v[j]+=b.v[i];
    48                 b.v[i]=0;
    49             }
    50             if(check(b)){
    51                     printf("%d
    ",b.step);return;
    52                 }
    53                 if(!vis[b.v[1]][b.v[2]]){
    54                     dl.push(b);vis[b.v[1]][b.v[2]]=1;
    55                 }
    56         }
    57         }
    58     puts("NO");
    59 }
    60 int main(){
    61     while(~scanf("%d%d%d",c,c+1,c+2),c[0]|c[1]|c[2]){
    62         if(c[0]&1)puts("NO");
    63         else bfs();
    64     }
    65     return 0;}
  • 相关阅读:
    对unsigned int和int进行移位操作的区别
    ctags支持的语言
    ubuntu使用问题与解决记录[持续更新]
    [转]python起步之卡尔曼滤波
    Android Studio的安装使用记录[持续更新]
    web.py实现jsonp
    关于python的import
    git常用命令[持续更新]
    flot图表的使用
    迁移web.py项目至git@osc的项目演示平台
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4928084.html
Copyright © 2011-2022 走看看