poj 3414 Pots-bfs
题目链接:http://poj.org/problem?id=3414
参考博客:https://blog.csdn.net/tigerisland45/article/details/52208174
代码实现:
1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<algorithm> 5 #include<string> 6 #include<cstring> 7 using namespace std; 8 const int MAXN=100; 9 int a,b,c; 10 bool vis[MAXN+1][MAXN+1]; 11 struct node{ 12 int a,b,level; 13 int plen; 14 char path[MAXN+1]; 15 }; 16 string path[]={ 17 "FILL(1)","FILL(2)","DROP(1)","DROP(2)", 18 "POUR(1,2)","POUR(2,1)" 19 }; 20 void output(int len,char p[],int n) 21 { 22 printf("%d\n",len); 23 for(int i=0;i<n;i++){ 24 cout<<path[(int)p[i]]<<endl; 25 } 26 } 27 void bfs() 28 { 29 memset(vis,false,sizeof(vis)); 30 queue<node>q; 31 node f; 32 f.a=0; f.b=0; f.level=0; 33 f.plen=0; 34 memset(f.path,0,sizeof(f.path)); 35 q.push(f); 36 vis[f.a][f.b]=true; 37 38 while(!q.empty()){ 39 f=q.front(); 40 q.pop(); 41 if(f.a==c || f.b==c){ 42 output(f.level,f.path,f.plen); 43 return; 44 } 45 46 node v; 47 v=f; 48 v.level++; 49 v.plen++; 50 //FILL(a) 51 if(a-f.a>0){ 52 v.a=a; 53 v.b=f.b; 54 if(!vis[v.a][v.b]){ 55 v.path[f.plen]=0; 56 q.push(v); 57 vis[v.a][v.b]=true; 58 } 59 } 60 //FILL(b) 61 if(b-f.b>0){ 62 v.b=b; 63 v.a=f.a; 64 if(!vis[v.a][v.b]){ 65 v.path[f.plen]=1; 66 q.push(v); 67 vis[v.a][v.b]=true; 68 } 69 } 70 //DROP(a) 71 if(f.a){ 72 v.a=0; 73 v.b=f.b; 74 if(!vis[v.a][v.b]){ 75 v.path[f.plen]=2; 76 q.push(v); 77 vis[v.a][v.b]=true; 78 } 79 } 80 //DROP(a) 81 if(f.b){ 82 v.b=0; 83 v.a=f.a; 84 if(!vis[v.a][v.b]){ 85 v.path[f.plen]=3; 86 q.push(v); 87 vis[v.a][v.b]=true; 88 } 89 } 90 //POUR(a,b) 91 if(f.a && (f.b < b)){ 92 if(f.a > (b-f.b)){ 93 v.a=f.a-(b-f.b); 94 v.b=b; 95 }else{ 96 v.a=0; 97 v.b=f.b+f.a; 98 } 99 if(!vis[v.a][v.b]){ 100 v.path[f.plen]=4; 101 q.push(v); 102 vis[v.a][v.b]=true; 103 } 104 } 105 //POUR(b,a) 106 if(f.b && (f.a < a)){ 107 if(f.b > (a-f.a)){ 108 v.a=a; 109 v.b=f.b-(a-f.a); 110 }else{ 111 v.a=f.b+f.a; 112 v.b=0; 113 } 114 if(!vis[v.a][v.b]){ 115 v.path[f.plen]=5; 116 q.push(v); 117 vis[v.a][v.b]=true; 118 } 119 } 120 } 121 cout<<"impossible"<<endl; 122 } 123 int main() 124 { 125 scanf("%d%d%d",&a,&b,&c); 126 bfs(); 127 return 0; 128 }