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 }