Pots POJ - 3414(DFS)
阿新 • • 發佈:2020-08-07
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
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 }