HDOJ 1495

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

 

posted @ 2018-07-26 00:45  huluxin  阅读(149)  评论(0编辑  收藏  举报