Pots POJ - 3414(DFS)

Pots

小明给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作
FILL(i)        将第i个容器从水龙头里装满(1 ≤ i ≤ 2);
DROP(i)        将第i个容器抽干
POUR(i,j)      将第i个容器里的水倒入第j个容器(这次操作结束后产生两种结果,一是第j个容器倒满并且第i个容器依旧有剩余,二是第i个容器里的水全部倒入j中,第i个容器为空)
现在要求你写一个程序,来找出能使其中任何一个容器里的水恰好有C升,找出最少操作数并给出操作过程

Input

有且只有一行,包含3个数A,B,C(1<=A,B<=100,C<=max(A,B))

Output

第一行包含一个数表示最小操作数K
随后K行每行给出一次具体操作,如果有多种答案符合最小操作数,输出他们中的任意一种操作过程,如果你不能使两个容器中的任意一个满足恰好C升的话,输出“impossible”

Sample Input

3 5 4

Sample Output

6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)




思路:
开始时两个罐子都是空的,分6种情况搜索寻找最小值即可。

代码:
  1 #include <set>
  2 #include <map>
  3 #include <list>
  4 #include <stack>
  5 #include <queue>
  6 #include <deque>
  7 #include <cmath>
  8 #include <string>
  9 #include <vector>
 10 #include <cstdio>
 11 #include <cstring>
 12 #include <cstdlib>
 13 #include <sstream>
 14 #include <iostream>
 15 #include <algorithm>
 16 //#include <unordered_map>
 17 #define INF 0x3f3f3f3f
 18 #define ll long long
 19 #define ull unsigned long long
 20 #define FILL(a,n,v) fill(a,a+n,v)
 21 #define Mset(a,v) memset(a,v,sizeof a)
 22 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
 23 using namespace std;
 24 
 25 int A,B,C;
 26 string op[1000];
 27 string res[1000];
 28 bool vis[200][200];
 29 bool flag;
 30 int cnt=0;
 31 int minn=INF;
 32 void dfs(int a,int b)
 33 {
 34     if(a==C||b==C)
 35     {
 36         flag=1;
 37         if(cnt<minn)
 38         {
 39             minn=cnt;
 40             for(int i=0;i<cnt;i++) res[i]=op[i];
 41         }
 42         return;
 43     }
 44     int aa,bb;
 45     //1
 46     aa=A;
 47     bb=b;
 48     if(vis[aa][bb])
 49     {
 50         vis[aa][bb]=false;
 51         op[cnt++]="FILL(1)";
 52         dfs(aa,bb);
 53         vis[aa][bb]=true;
 54         cnt--;
 55     }
 56     //2
 57     aa=a;
 58     bb=B;
 59     if(vis[aa][bb])
 60     {
 61         vis[aa][bb]=false;
 62         op[cnt++]="FILL(2)";
 63         dfs(aa,bb);
 64         vis[aa][bb]=true;
 65         cnt--;
 66     }
 67     //3
 68     aa=0;
 69     bb=b;
 70     if(vis[aa][bb])
 71     {
 72         vis[aa][bb]=false;
 73         op[cnt++]="DROP(1)";
 74         dfs(aa,bb);
 75         vis[aa][bb]=true;
 76         cnt--;
 77     }
 78     //4
 79     aa=a;
 80     bb=0;
 81     if(vis[aa][bb])
 82     {
 83         vis[aa][bb]=false;
 84         op[cnt++]="DROP(2)";
 85         dfs(aa,bb);
 86         vis[aa][bb]=true;
 87         cnt--;
 88     }
 89     //5
 90     aa=(a+b<=A?a+b:A);
 91     bb=a+b-aa;
 92     if(vis[aa][bb])
 93     {
 94         vis[aa][bb]=false;
 95         op[cnt++]="POUR(2,1)";
 96         dfs(aa,bb);
 97         vis[aa][bb]=true;
 98         cnt--;
 99     }
100     //6
101     bb=(a+b<=B?a+b:B);
102     aa=a+b-bb;
103     if(vis[aa][bb])
104     {
105         vis[aa][bb]=false;
106         op[cnt++]="POUR(1,2)";
107         dfs(aa,bb);
108         vis[aa][bb]=true;
109         cnt--;
110     }
111 }
112 
113 int main()
114 {
115     cin>>A>>B>>C;
116     memset(vis,true,sizeof vis);
117     flag=0;
118     
119     dfs(0,0);
120     if(flag==0) cout<<"impossible"<<endl;
121     else
122     {
123         cout<<minn<<endl;
124         for(int i=0;i<minn;i++)
125         {
126             cout<<res[i]<<endl;
127         }
128     }
129 }

 

posted @ 2020-08-07 09:57  lihaji  阅读(102)  评论(0编辑  收藏  举报