poj3414(bfs)

时间:2023-08-11 14:33:26

题目链接: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[][];
struct node
{
int x,y;
int step;
};
struct point
{
int x,y,op;
}pre[][];
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==)
{
return ;
}
path(pre[x][y].x,pre[x][y].y);
if(pre[x][y].op==)
{
printf("FILL(1)\n");
return;
}
if(pre[x][y].op==)
{
printf("FILL(2)\n");
return;
}
if(pre[x][y].op==)
{
printf("DROP(1)\n");
return;
}
if(pre[x][y].op==)
{
printf("DROP(2)\n");
return;
}
if(pre[x][y].op==)
{
printf("POUR(2,1)\n");
return;
}
if(pre[x][y].op==)
{
printf("POUR(1,2)\n");
return;
}
}
void bfs()
{
queue<node>que;
while(!que.empty())que.pop();
memset(vis,,sizeof(vis));
memset(pre,,sizeof(pre));
node cur,nxt;
vis[][]=;
que.push(make_node(,,));
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=;
return;
}//printf("%d %d\n",cur.x,cur.y);
if(!vis[a][cur.y])
{
vis[a][cur.y]=;
pre[a][cur.y].x=cur.x;
pre[a][cur.y].y=cur.y;
pre[a][cur.y].op=;
que.push(make_node(a,cur.y,cur.step+));
}
if(!vis[cur.x][b])
{
vis[cur.x][b]=;
pre[cur.x][b].x=cur.x;
pre[cur.x][b].y=cur.y;
pre[cur.x][b].op=;
que.push(make_node(cur.x,b,cur.step+));
}
if(!vis[][cur.y])
{
vis[][cur.y]=;
pre[][cur.y].x=cur.x;
pre[][cur.y].y=cur.y;
pre[][cur.y].op=;
que.push(make_node(,cur.y,cur.step+));
}
if(!vis[cur.x][])
{
vis[cur.x][]=;
pre[cur.x][].x=cur.x;
pre[cur.x][].y=cur.y;
pre[cur.x][].op=;
que.push(make_node(cur.x,,cur.step+));
}
if(cur.x+cur.y<=a)
{
int xx=cur.x+cur.y,yy=;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
else
{
int xx=a,yy=cur.x+cur.y-a;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
if(cur.x+cur.y<=b)
{
int xx=,yy=cur.x+cur.y;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
else
{
int xx=cur.x+cur.y-b,yy=b;
if(!vis[xx][yy])
{
vis[xx][yy]=;
pre[xx][yy].x=cur.x;
pre[xx][yy].y=cur.y;
pre[xx][yy].op=;
que.push(make_node(xx,yy,cur.step+));
}
}
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)>)
{
ok=;
bfs();
if(ok==)puts("impossible");
}
}