Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4280 | Accepted: 2533 | Special Judge |
Description
Input
Output
Sample Input
3 5 4 5 7 3
Sample Output
fill B pour B A empty A pour B A fill B pour B A success fill A pour A B fill A pour A B empty B pour A B success
解题方法:类似于三个水杯倒水问题,用广搜。
#include <stdio.h> #include <iostream> #include <string.h> using namespace std; typedef struct cup { int a; int b; int pre; int step; }Cup; Cup Queue[100000]; int nCount = 0; void PrintStep(int step) { switch(step) { case 0: printf("fill A\n"); break; case 1: printf("fill B\n"); break; case 2: printf("empty A\n"); break; case 3: printf("empty B\n"); break; case 4: printf("pour A B\n"); break; case 5: printf("pour B A\n"); break; } } void Print(int front) { int k = front, j; for (;;) { j = k; k = Queue[k].pre; if (Queue[j].pre == -1) { Queue[j].pre = -2; break; } else { Queue[j].pre = -2; } } for (int i = 0; i <= nCount; i++) { if (Queue[i].pre == -2) { PrintStep(Queue[i].step); } } printf("success\n"); } bool IsExit(int a, int b) { for (int i = 0; i <= nCount; i++) { if (Queue[i].a == a && Queue[i].b == b) { return true; } } return false; } void BFS(int va, int vb, int result) { if (va == result) { printf("fill A\nsuccess\n"); return; } if (vb == result) { printf("fill B\nsuccess\n"); return; } int front = -1; int rear = -1; memset(Queue, 0, sizeof(Queue)); ++nCount; Queue[++rear].pre = -1; Queue[rear].a = va; Queue[rear].b = 0; Queue[rear].step = 0; ++nCount; Queue[++rear].pre = -1; Queue[rear].a = 0; Queue[rear].b = vb; Queue[rear].step = 1; int a, b; while(front <= rear) { int cura = Queue[++front].a; int curb = Queue[front].b; if (cura == result || curb == result) { Print(front); return; } if (cura > 0) { if (cura + curb > vb) { a = cura + curb - vb; b = vb; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 4; ++nCount; } } else { a = 0; b = cura + curb; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 4; ++nCount; } } a = 0; b = curb; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 2; ++nCount; } } a = va; b = curb; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 0; ++nCount; } if (curb > 0) { if (cura + curb > va) { a = va; b = cura + curb - va; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 5; ++nCount; } } else { a = cura + curb; b = 0; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 5; ++nCount; } } a = cura; b = 0; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 3; ++nCount; } } a = cura; b = vb; if (!IsExit(a, b)) { Queue[++rear].a = a; Queue[rear].b = b; Queue[rear].pre = front; Queue[rear].step = 1; ++nCount; } } } int main() { int va, vb, result; while(scanf("%d%d%d", &va, &vb, &result) != EOF) { nCount = -1; memset(Queue, 0, sizeof(Queue)); BFS(va, vb, result); } return 0; }