标签:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc(x) scanf("%d",&(x)) 6 #define pf(x) printf("%d\n", x) 7 #define CL(x, y) memset(x, y, sizeof(x)) 8 using namespace std; 9 const int MAX = 105; 10 int front, rear; 11 int used[MAX][MAX]; 12 char str[6][10]= {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"}; 13 struct node 14 { 15 int a, b; 16 int n; 17 int step; 18 node *pre; 19 } Q[MAX*MAX]; //数组模拟队列 queue<Node> q; 20 void back(node a); 21 void BFS(int a, int b, int c); 22 int main() 23 { 24 int a,b,c; 25 while(cin >> a >> b >> c) 26 { 27 CL(used, 0); 28 BFS(a, b, c); 29 //pf(Q[rear].step); 30 back(Q[rear]); 31 cout << "success" << endl; 32 } 33 } 34 void back(node a) 35 { 36 if(a.pre != NULL) 37 { 38 //printf("%s\n", str[a.n]); 39 back(*(a.pre));//递归,找出初始操作 40 printf("%s\n", str[a.n]); 41 } 42 return ; 43 } 44 void BFS(int a, int b, int c) 45 { 46 front = 0; 47 rear = 0; 48 Q[front].a = 0; 49 Q[front].b = 0; 50 Q[front].pre = NULL; 51 Q[front].step = 0; 52 used[0][0] = 1; 53 rear++; 54 while(front != rear) 55 { 56 node now = Q[front]; //{0, 0, NULL, 0} 57 used[now.a][now.b] = 1; 58 if(!used[a][now.b] && now.a!=a)//fill A 将 A 加满 59 { 60 Q[rear].n = 0; //记录执行的操作 61 Q[rear].step = Q[front].step + 1; //步骤 +1 62 Q[rear].a = a; 63 Q[rear].b = now.b; 64 Q[rear].pre = &Q[front]; 65 used[a][now.b] = 1; 66 if(a==c || now.b==c) break; //完成操作 67 rear++; 68 } 69 if(!used[now.a][b] && now.b!=b)//fill B 将 B 加满 70 { 71 Q[rear].n = 1; 72 Q[rear].step = Q[front].step+1; 73 Q[rear].a = now.a; 74 Q[rear].b = b; 75 Q[rear].pre = &Q[front]; 76 used[now.a][b] = 1; 77 if(now.a==c || b==c) break; 78 rear++; 79 } 80 if(!used[0][now.b] && now.a!=0)//empty A 81 { 82 Q[rear].n = 2; 83 Q[rear].step = Q[front].step + 1; 84 Q[rear].a = 0; 85 Q[rear].b = now.b; 86 Q[rear].pre = &Q[front]; 87 used[0][now.b] = 1; 88 if(now.b == c) break;//A中没有水 89 rear++; 90 } 91 if(!used[now.a][0] && now.b!=0)//empty B 92 { 93 Q[rear].n = 3; 94 Q[rear].step = Q[front].step + 1; 95 Q[rear].a = now.a; 96 Q[rear].b = 0; 97 Q[rear].pre = &Q[front]; 98 used[now.a][0] = 1; 99 if(now.a == c) break;//B中没有水 100 rear++; 101 } 102 int x = now.a < b-now.b ? now.a : b-now.b; 103 if(!used[now.a-x][now.b+x])//pour A B 104 { 105 Q[rear].n = 4; 106 Q[rear].step = Q[front].step+1; 107 Q[rear].a = now.a - x; 108 Q[rear].b = now.b + x; 109 Q[rear].pre = &Q[front]; 110 used[now.a-x][now.b+x] = 1; 111 if(now.a-x==c || now.b+x==c) break; 112 rear++; 113 } 114 int y = a-now.a < now.b ? a-now.a : now.b;//找到与自己本壶最接近的到水量 115 if(!used[now.a+y][now.b-y])//pour B A 116 { 117 Q[rear].n = 5; 118 Q[rear].step = Q[front].step+1; 119 Q[rear].a = now.a+y; 120 Q[rear].b = now.b-y; 121 Q[rear].pre = &Q[front]; 122 used[now.a+y][now.b-y] = 1; 123 if(now.a+y==c || now.b-y==c) break; 124 rear++; 125 } 126 front++; 127 }//跳出循环时, front==rear 128 //if(front == rear) printf("impossible\n");//条件判断 129 }
上面解法不完整,但是还是在POJ上面过了
应该是使得B中存留那么多水
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #define sc(x) scanf("%d",&(x)) 6 #define pf(x) printf("%d\n", x) 7 #define CL(x, y) memset(x, y, sizeof(x)) 8 using namespace std; 9 const int MAX = 105; 10 int front, rear; 11 int used[MAX][MAX]; 12 char str[6][10]= {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"}; 13 struct node 14 { 15 int a, b; 16 int n; 17 int step; 18 node *pre; 19 } Q[MAX*MAX]; //数组模拟队列 queue<Node> q; 20 void back(node a); 21 void BFS(int a, int b, int c); 22 int main() 23 { 24 int a,b,c; 25 while(cin >> a >> b >> c) 26 { 27 CL(used, 0); 28 BFS(a, b, c); 29 //pf(Q[rear].step); 30 back(Q[rear]); 31 cout << "success" << endl; 32 } 33 } 34 void back(node a) 35 { 36 if(a.pre != NULL) 37 { 38 //printf("%s\n", str[a.n]); 39 back(*(a.pre));//递归,找出初始操作 40 printf("%s\n", str[a.n]); 41 } 42 return ; 43 } 44 void BFS(int a, int b, int c) 45 { 46 front = 0; 47 rear = 0; 48 Q[front].a = 0; 49 Q[front].b = 0; 50 Q[front].pre = NULL; 51 Q[front].step = 0; 52 used[0][0] = 1; 53 rear++; 54 while(front != rear) 55 { 56 node now = Q[front]; //{0, 0, NULL, 0} 57 used[now.a][now.b] = 1; 58 if(!used[a][now.b] && now.a!=a)//fill A 将 A 加满 59 { 60 Q[rear].n = 0; //记录执行的操作 61 Q[rear].step = Q[front].step + 1; //步骤 +1 62 Q[rear].a = a; 63 Q[rear].b = now.b; 64 Q[rear].pre = &Q[front]; 65 used[a][now.b] = 1; 66 //if(a==c || now.b==c) break; //完成操作 67 if(now.b==c) break; //完成操作 68 rear++; 69 } 70 if(!used[now.a][b] && now.b!=b)//fill B 将 B 加满 71 { 72 Q[rear].n = 1; 73 Q[rear].step = Q[front].step+1; 74 Q[rear].a = now.a; 75 Q[rear].b = b; 76 Q[rear].pre = &Q[front]; 77 used[now.a][b] = 1; 78 //if(now.a==c || b==c) break; 79 if(b==c) break; 80 rear++; 81 } 82 if(!used[0][now.b] && now.a!=0)//empty A 83 { 84 Q[rear].n = 2; 85 Q[rear].step = Q[front].step + 1; 86 Q[rear].a = 0; 87 Q[rear].b = now.b; 88 Q[rear].pre = &Q[front]; 89 used[0][now.b] = 1; 90 if(now.b == c) break;//A中没有水 91 rear++; 92 } 93 if(!used[now.a][0] && now.b!=0)//empty B 94 { 95 Q[rear].n = 3; 96 Q[rear].step = Q[front].step + 1; 97 Q[rear].a = now.a; 98 Q[rear].b = 0; 99 Q[rear].pre = &Q[front]; 100 used[now.a][0] = 1; 101 // if(now.a == c) break;//B中没有水 102 rear++; 103 } 104 int x = now.a < b-now.b ? now.a : b-now.b; 105 if(!used[now.a-x][now.b+x])//pour A B 106 { 107 Q[rear].n = 4; 108 Q[rear].step = Q[front].step+1; 109 Q[rear].a = now.a - x; 110 Q[rear].b = now.b + x; 111 Q[rear].pre = &Q[front]; 112 used[now.a-x][now.b+x] = 1; 113 //if(now.a-x==c || now.b+x==c) break; 114 if(now.b+x==c) break; 115 rear++; 116 } 117 int y = a-now.a < now.b ? a-now.a : now.b;//找到与自己本壶最接近的到水量 118 if(!used[now.a+y][now.b-y])//pour B A 119 { 120 Q[rear].n = 5; 121 Q[rear].step = Q[front].step+1; 122 Q[rear].a = now.a+y; 123 Q[rear].b = now.b-y; 124 Q[rear].pre = &Q[front]; 125 used[now.a+y][now.b-y] = 1; 126 //if(now.a+y==c || now.b-y==c) break; 127 if(now.b-y==c) break; 128 rear++; 129 } 130 front++; 131 }//跳出循环时, front==rear 132 //if(front == rear) printf("impossible\n");//条件判断 133 }
标签:
原文地址:http://www.cnblogs.com/tyx0604/p/4305596.html