当前位置: 代码迷 >> 综合 >> poj-3414-bfs
  详细解决方案

poj-3414-bfs

热度:2   发布时间:2023-12-19 11:29:32.0

题意:

给你三个数:a,b,c

让你通过一系列的动作,初始时,A=B=0;使得A=c或者B=c;

动作:

1,A=a;

2,B=b;

3,A=0;B=B;

4,A=A,B=0;

5,A=(B往A中走,最大不超过a),B=走剩下的。

6,B=(A往B中走,最大不超过b),A=走剩下的。

做法:

总共就有6中情况,bfs就行。注意当A,B都满了的时候,不走5,6;

#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct list
{int x;int y;int vis[1000];int step;
}p,pp;
int a,b,c;
queue<struct list>q;
int visit[101][101];
void change(int x,int y,int z)
{if(!visit[x][y]){visit[x][y]=1;pp=p;pp.x=x;pp.y=y;pp.vis[++pp.step]=z;q.push(pp);}
}
void put()
{int i;printf("%d\n",p.step);for(i=1;i<=p.step;i++){switch(p.vis[i]){case 1:printf("FILL(%d)\n",1);break;case 2:printf("FILL(%d)\n",2);break;case 3:printf("DROP(%d)\n",1);break;case 4:printf("DROP(%d)\n",2);break;case 5:printf("POUR(%d,%d)\n",1,2);break;case 6:printf("POUR(%d,%d)\n",2,1);break;}}
}
int main()
{cin>>a>>b>>c;memset(visit,0,sizeof(visit));p.x=0;p.y=0;p.step=0;p.vis[0]=0;visit[0][0]=1;q.push(p);while(!q.empty()){p=q.front();q.pop();if(p.x==c||p.y==c){put();return 0;}change(a,p.y,1);change(p.x,b,2);change(0,p.y,3);change(p.x,0,4);int xx,yy;if(p.x==a&&p.y==b)continue;if(p.x+p.y>a)xx=a,yy=p.y-a+p.x;else xx=p.x+p.y,yy=0;change(xx,yy,6);if(p.x+p.y>b){xx=p.x-b+p.y,yy=b;}else xx=0,yy=p.x+p.y;change(xx,yy,5);}printf("impossible\n");return 0;
}