題意:兩個罐子倒水
題解:
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int a, b, n;bool vis[1010][1010], flag;int res[10100], step;void print(){ for(int i = 0; i < step; i++) { switch(res[i]) { case 1: printf("fill A\n"); break; case 2: printf("fill B\n"); break; case 3: printf("empty A\n"); break; case 4: printf("empty B\n"); break; case 5: printf("pour A B\n"); break; case 6: printf("pour B A\n"); break; case 7: printf("success\n"); break; } }}void dfs(int x, int y){ if(flag) return; if(x == n || y == n) { flag = true; res[step++] = 7; print(); return; } if(a > x && !vis[a][y] && !flag) { res[step++] = 1; vis[a][y] = true; dfs(a, y); step--; } if(b > y && !vis[x][b] && !flag) { res[step++] = 2; vis[x][b] = true; dfs(x, b); step--; } if(x != 0 && !vis[0][y] && !flag) { res[step++] = 3; vis[0][y] = true; dfs(0, y); step--; } if(y != 0 && !vis[x][0] && !flag) { res[step++] = 4; vis[x][0] = true; dfs(x, 0); step--; } int tmp = min(x, b - y); if(!vis[x-tmp][y+tmp] && !flag) { res[step++] = 5; vis[x-tmp][y+tmp] = true; dfs(x - tmp, y + tmp); step--; } tmp = min(a - x, y); if(!vis[x+tmp][y-tmp] && !flag) { res[step++] = 6; vis[x+tmp][y-tmp] = true; dfs(x + tmp, y - tmp); step--; }}int main(){ while(scanf("%d%d%d",&a,&b,&n) != EOF) { flag = false; memset(vis, 0, sizeof(vis)); step = 0; vis[0][0] = true; dfs(0, 0); } return 0;}