题目链接:http://poj.org/problem?id=3414
题意:给你两个容器 A B 问是否能够经过有限的步骤倒水,得到容量为 C 的水,输出最小的步数,同时输出每一步的操作。如果不能达到目标状态,则输出 impossible。
分析:这题跟hdu1495一样,需要分情况考虑,不过这里回溯输出路径。。。
具体分析情况看这里:http://www.tuicool.com/articles/fqeI3i
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <algorithm> #include <queue> #include <cstdlib> #include <stack> #include <vector> #include <set> #include <map> #define LL long long #define mod 1000000007 #define inf 0x3f3f3f3f #define N 100010 using namespace std; int a,b,c; int ok,vis[110][110]; struct node { int x,y; int step; }; struct point { int x,y,op; }pre[110][110]; node make_node(int a,int b,int c) { node temp; temp.x=a;temp.y=b;temp.step=c; return temp; } void path(int x,int y) { if(x+y==0) { return ; } path(pre[x][y].x,pre[x][y].y); if(pre[x][y].op==1) { printf("FILL(1)\n"); return; } if(pre[x][y].op==2) { printf("FILL(2)\n"); return; } if(pre[x][y].op==3) { printf("DROP(1)\n"); return; } if(pre[x][y].op==4) { printf("DROP(2)\n"); return; } if(pre[x][y].op==5) { printf("POUR(2,1)\n"); return; } if(pre[x][y].op==6) { printf("POUR(1,2)\n"); return; } } void bfs() { queue<node>que; while(!que.empty())que.pop(); memset(vis,0,sizeof(vis)); memset(pre,0,sizeof(pre)); node cur,nxt; vis[0][0]=1; que.push(make_node(0,0,0)); while(!que.empty()) { cur=que.front();que.pop(); if(cur.x==c||cur.y==c) { printf("%d\n",cur.step); path(cur.x,cur.y);ok=1; return; }//printf("%d %d\n",cur.x,cur.y); if(!vis[a][cur.y]) { vis[a][cur.y]=1; pre[a][cur.y].x=cur.x; pre[a][cur.y].y=cur.y; pre[a][cur.y].op=1; que.push(make_node(a,cur.y,cur.step+1)); } if(!vis[cur.x][b]) { vis[cur.x][b]=1; pre[cur.x][b].x=cur.x; pre[cur.x][b].y=cur.y; pre[cur.x][b].op=2; que.push(make_node(cur.x,b,cur.step+1)); } if(!vis[0][cur.y]) { vis[0][cur.y]=1; pre[0][cur.y].x=cur.x; pre[0][cur.y].y=cur.y; pre[0][cur.y].op=3; que.push(make_node(0,cur.y,cur.step+1)); } if(!vis[cur.x][0]) { vis[cur.x][0]=1; pre[cur.x][0].x=cur.x; pre[cur.x][0].y=cur.y; pre[cur.x][0].op=4; que.push(make_node(cur.x,0,cur.step+1)); } if(cur.x+cur.y<=a) { int xx=cur.x+cur.y,yy=0; if(!vis[xx][yy]) { vis[xx][yy]=1; pre[xx][yy].x=cur.x; pre[xx][yy].y=cur.y; pre[xx][yy].op=5; que.push(make_node(xx,yy,cur.step+1)); } } else { int xx=a,yy=cur.x+cur.y-a; if(!vis[xx][yy]) { vis[xx][yy]=1; pre[xx][yy].x=cur.x; pre[xx][yy].y=cur.y; pre[xx][yy].op=5; que.push(make_node(xx,yy,cur.step+1)); } } if(cur.x+cur.y<=b) { int xx=0,yy=cur.x+cur.y; if(!vis[xx][yy]) { vis[xx][yy]=1; pre[xx][yy].x=cur.x; pre[xx][yy].y=cur.y; pre[xx][yy].op=6; que.push(make_node(xx,yy,cur.step+1)); } } else { int xx=cur.x+cur.y-b,yy=b; if(!vis[xx][yy]) { vis[xx][yy]=1; pre[xx][yy].x=cur.x; pre[xx][yy].y=cur.y; pre[xx][yy].op=6; que.push(make_node(xx,yy,cur.step+1)); } } } } int main() { while(scanf("%d%d%d",&a,&b,&c)>0) { ok=0; bfs(); if(ok==0)puts("impossible"); } }
时间: 2024-10-10 05:39:50