• M


      1 #include <string.h>
      2 #include <stdio.h>
      3 #include <queue>
      4 using namespace std;
      5 
      6 int s,n,m;
      7 int vis[105][105][105];
      8 
      9 struct node
     10 {
     11     int s,n,m,step;
     12 };
     13 int check(int x,int y,int z)//平分条件
     14 {
     15     if(x == 0 && y == z)
     16         return 1;
     17     if(y == 0 && x == z)
     18         return 1;
     19     if(z == 0 && x == y)
     20         return 1;
     21     return 0;
     22 }
     23 
     24 int bfs()
     25 {
     26     queue<node> Q;
     27     node a,next;
     28     a.s = s;
     29     a.n = 0;
     30     a.m = 0;
     31     a.step = 0;
     32     vis[s][0][0] = 1;
     33     Q.push(a);
     34     while(!Q.empty())
     35     {
     36         a = Q.front();
     37         Q.pop();
     38         if(check(a.s,a.n,a.m))
     39             return a.step;
     40         if(a.n)//当n杯中还有
     41         {
     42             if(a.n>s-a.s)//将n杯倒入s杯中能将s杯倒满
     43             {
     44                 next = a;
     45                 next.n = next.n-(s-a.s);
     46                 next.s = s;
     47                 if(!vis[next.s][next.n][next.m])
     48                 {
     49                     next.step = a.step+1;
     50                     Q.push(next);
     51                     vis[next.s][next.n][next.m] = 1;
     52                 }
     53             }
     54             else//将n杯倒入s杯中不能将s杯倒满
     55             {
     56                 next = a;
     57                 next.s = next.n+next.s;
     58                 next.n = 0;
     59                 if(!vis[next.s][next.n][next.m])
     60                 {
     61                     next.step = a.step+1;
     62                     Q.push(next);
     63                     vis[next.s][next.n][next.m] = 1;
     64                 }
     65             }
     66             if(a.n>m-a.m)//将n杯倒入m杯中能将m杯倒满
     67             {
     68                 next = a;
     69                 next.n = next.n-(m-a.m);
     70                 next.m =  m;
     71                 if(!vis[next.s][next.n][next.m])
     72                 {
     73                     next.step = a.step+1;
     74                     Q.push(next);
     75                     vis[next.s][next.n][next.m] = 1;
     76                 }
     77             }
     78             else//将n杯倒入m杯中不能将m杯倒满
     79             {
     80                 next = a;
     81                 next.m = next.n+next.m;
     82                 next.n = 0;
     83                 if(!vis[next.s][next.n][next.m])
     84                 {
     85                     next.step = a.step+1;
     86                     Q.push(next);
     87                     vis[next.s][next.n][next.m] = 1;
     88                 }
     89             }
     90         }
     91         if(a.m)//同上
     92         {
     93             if(a.m>s-a.s)
     94             {
     95                 next = a;
     96                 next.m = next.m-(s-a.s);
     97                 next.s = s;
     98                 if(!vis[next.s][next.n][next.m])
     99                 {
    100                     next.step = a.step+1;
    101                     Q.push(next);
    102                     vis[next.s][next.n][next.m] = 1;
    103                 }
    104             }
    105             else
    106             {
    107                 next = a;
    108                 next.s = next.m+next.s;
    109                 next.m = 0;
    110                 if(!vis[next.s][next.n][next.m])
    111                 {
    112                     next.step = a.step+1;
    113                     Q.push(next);
    114                     vis[next.s][next.n][next.m] = 1;
    115                 }
    116             }
    117             if(a.m>n-a.n)
    118             {
    119                 next = a;
    120                 next.m = next.m-(n-a.n);
    121                 next.n =  n;
    122                 if(!vis[next.s][next.n][next.m])
    123                 {
    124                     next.step = a.step+1;
    125                     Q.push(next);
    126                     vis[next.s][next.n][next.m] = 1;
    127                 }
    128             }
    129             else
    130             {
    131                 next = a;
    132                 next.n = next.m+next.n;
    133                 next.m = 0;
    134                 if(!vis[next.s][next.n][next.m])
    135                 {
    136                     next.step = a.step+1;
    137                     Q.push(next);
    138                     vis[next.s][next.n][next.m] = 1;
    139                 }
    140             }
    141         }
    142         if(a.s)//同上
    143         {
    144             if(a.s>n-a.n)
    145             {
    146                 next = a;
    147                 next.s = next.s-(n-a.n);
    148                 next.n = n;
    149                 if(!vis[next.s][next.n][next.m])
    150                 {
    151                     next.step = a.step+1;
    152                     Q.push(next);
    153                     vis[next.s][next.n][next.m] = 1;
    154                 }
    155             }
    156             else
    157             {
    158                 next = a;
    159                 next.n = next.s+next.n;
    160                 next.s = 0;
    161                 if(!vis[next.s][next.n][next.m])
    162                 {
    163                     next.step = a.step+1;
    164                     Q.push(next);
    165                     vis[next.s][next.n][next.m] = 1;
    166                 }
    167             }
    168             if(a.s>m-a.m)
    169             {
    170                 next = a;
    171                 next.s = next.s-(m-a.m);
    172                 next.m =  m;
    173                 if(!vis[next.s][next.n][next.m])
    174                 {
    175                    next.step = a.step+1;
    176                     Q.push(next);
    177                     vis[next.s][next.n][next.m] = 1;
    178                 }
    179             }
    180             else
    181             {
    182                 next = a;
    183                 next.m = next.m+next.s;
    184                 next.s = 0;
    185                 if(!vis[next.s][next.n][next.m])
    186                 {
    187                     next.step = a.step+1;
    188                     Q.push(next);
    189                     vis[next.s][next.n][next.m] = 1;
    190                 }
    191             }
    192         }
    193     }
    194     return 0;
    195 }
    196 
    197 int main()
    198 {
    199     int ans;
    200     while(~scanf("%d%d%d",&s,&n,&m))
    201     {
    202         if(s ==0 && n ==0 &&m==0)
    203             break;
    204         if(s%2)
    205         {
    206             printf("NO
    ");
    207             continue;
    208         }
    209         memset(vis,0,sizeof(vis));
    210         ans = bfs();
    211         if(ans)
    212             printf("%d
    ",ans);
    213         else
    214             printf("NO
    ");
    215     }
    216     return 0;
    217 }
  • 相关阅读:
    week4
    week3
    2017福州大学面向对象程序设计寒假作业二
    Week2
    10个android开发必备的开源项目
    Day Ten
    Day Nine
    Day Eight
    Day Seven
    Day Six
  • 原文地址:https://www.cnblogs.com/ouyang_wsgwz/p/8971462.html
Copyright © 2020-2023  润新知