蘑菇街春招 - 编程题第二题 - 隐式图搜索 - 四个水杯
2016-03-31 21:41
288 查看
#include <bits/stdc++.h> using namespace std; struct CUP { int x, y;//x表示当前杯子内水的体积 //y表示这个杯子的容量 }; struct Node { CUP a[4];//4个杯子的状态 int step; } st, ENDDD; bool flag[111][111][111][111];//标记 int dir[12][2] = {//dir[i][j]表示杯子i向杯子j倒水 0, 1, 0, 2, 0, 3, 1, 0, 1, 2, 1, 3, 2, 0, 2, 1, 2, 3, 3, 0, 3, 1, 3, 2, }; int BFS() { queue<Node> que; que.push(st); memset(flag, false, sizeof(flag)); flag[10][0][0][0] = true; while (!que.empty()) { Node pre = que.front(); que.pop(); if (pre.a[0].x == ENDDD.a[0].x && pre.a[1].x == ENDDD.a[1].x && pre.a[2].x == ENDDD.a[2].x && pre.a[3].x == ENDDD.a[3].x) return pre.step; for (int i = 0; i < 12; i++) { int a = dir[i][0], b = dir[i][1]; Node tmp = pre; // 要用一个中间变量,不然状态会被改变 if (tmp.a[a].x == 0 || tmp.a[b].x == tmp.a[b].y) continue; if (tmp.a[a].x >= tmp.a[b].y - tmp.a[b].x)//能倒满 { tmp.a[a].x -= (tmp.a[b].y - tmp.a[b].x);//注意这两条语句的顺序,很重要 tmp.a[b].x = tmp.a[b].y; } else if (tmp.a[a].x + tmp.a[b].x <= tmp.a[b].y)// 倒空 { tmp.a[b].x += tmp.a[a].x; tmp.a[a].x = 0; } if (flag[tmp.a[0].x][tmp.a[1].x][tmp.a[2].x][tmp.a[3].x] == false) { flag[tmp.a[0].x][tmp.a[1].x][tmp.a[2].x][tmp.a[3].x] = true; tmp.step = pre.step + 1; que.push(tmp); } } } return 0; } int main() { int a, b, c, d; while (~scanf("%d%d%d%d", &a, &b, &c, &d)) { if (a + b + c + d != 10) { printf("-1\n"); continue; } st.a[0].x = 10;//初始化 st.a[0].y = 10; st.a[1].x = 0; st.a[1].y = 6; st.a[2].x = 0; st.a[2].y = 5; st.a[3].x = 0; st.a[3].y = 4; st.step = 0; ENDDD.a[0].x = a; ENDDD.a[0].y = 10; ENDDD.a[1].x = b; ENDDD.a[1].y = 6; ENDDD.a[2].x = c; ENDDD.a[2].y = 5; ENDDD.a[3].x = d; ENDDD.a[3].y = 4; ENDDD.step = 0; int ans = BFS(); printf("%d\n", ans); } return 0; }