poj3414 bfs()

来源:互联网 发布:ubuntu16.04 ssd 优化 编辑:程序博客网 时间:2024/06/08 03:04

题目链接:http://poj.org/problem?id=3414

题意: 给你两个空的瓶子,容量为输入的A,B,问经过几步操作任意一个瓶子能够得到C的水量;

6个操作:用水装满A瓶FILL(1),用水装满B瓶FILL(2),将A内水倒出DROP(1),将B内水倒出DROP(2),

将A内的水倒入B内POUR(1,2),将B内的水倒入A内POUR(2,1).注意倒后剩余的水保留在原水瓶中.

解题方法: 直接暴力搜索每一种状态,就可以了...

这是我做的第一道需要输出过程的BFS()具有保留意义..哈哈


#include<iostream>#include<cstring>#include<map>using namespace std;struct node{int a,b;int pos;int step;string out;}ic,tmp;int a,b,c;bool vis[105][105];map<string,bool>m;void init(){memset(vis,0,sizeof(vis));m.clear();}void bfs(){node queue[1000];int head=0;int tail=0;queue[tail].a=queue[tail].b=queue[tail++].step=0;vis[0][0]=1;while(head<tail){ic=queue[head];if(ic.a==c||ic.b==c){cout<<ic.step<<endl;int x=ic.step;string s[1000];for(int i=0;i<x;++i){    s[i]=ic.out;ic=queue[ic.pos];}for(int i=x-1;i>=0;--i)cout<<s[i]<<endl;return ;}//<1>..........................tmp=queue[head];tmp.a=a;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="FILL(1)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }//<2>..........................tmp=queue[head];tmp.b=b;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="FILL(2)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }//<3>...........................tmp=queue[head];tmp.a=0;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="DROP(1)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }        //<4>..............................    tmp=queue[head];tmp.b=0;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="DROP(2)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }        //<5>...............................    tmp=queue[head];int x=min(tmp.a,b-tmp.b);tmp.a-=x;tmp.b+=x;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="POUR(1,2)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }        //<6>...............................    tmp=queue[head];x=min(a-tmp.a,tmp.b);tmp.a+=x;tmp.b-=x;if(!vis[tmp.a][tmp.b]){   tmp.step++;   tmp.pos=head;   tmp.out="POUR(2,1)";   queue[tail++]=tmp;   vis[tmp.a][tmp.b]=1;    }    head++;}cout<<"impossible"<<endl;}int main(){while(cin>>a>>b>>c){init();bfs();}}


0 0
原创粉丝点击