ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Pots POJ - 3414(DFS)

2020-08-07 10:01:48  阅读:279  来源: 互联网

标签:容器 int Pots POUR 3414 POJ FILL include define


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 }

 

标签:容器,int,Pots,POUR,3414,POJ,FILL,include,define
来源: https://www.cnblogs.com/lihahahahaji/p/13450927.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有