搜索-状态空间搜索

来源:互联网 发布:开淘宝店前期如何推广 编辑:程序博客网 时间:2024/05/15 20:56
//poj3414#include<iostream>#include<cstdio>#include<cctype>#include<cmath>#include<cstring>#include<algorithm>#include<set>#include<map>#include<vector>#include<queue>#include<deque>using namespace std;const int maxn=1005;struct T{    int a,b,c,d,e;}shz[maxn];T T1(int a,int b,int c,int d,int e){    T t;    t.a=a,t.b=b,t.c=c,t.d=d,t.e=e;    return t;}int mp[105][105];string str[7]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};int main(){    int v1,v2,v3;    cin>>v1>>v2>>v3;    //1加满a,2加满b,3清空a,4清空b,5a到b,6b到a     memset(mp,0,sizeof(mp));    shz[1]=T1(0,0,-1,-1,0);    int f1=1,f2=1;    int ans=0;    while(f1<=f2){        if(!mp[v1][shz[f1].b]){            mp[v1][shz[f1].b]=1;            shz[++f2]=T1(v1,shz[f1].b,f1,1,shz[f1].e+1);            if(shz[f2].a==v3||shz[f2].b==v3){                ans=f2;                break;              }        }        if(!mp[shz[f1].a][v2]){            mp[shz[f1].a][v2]=1;            shz[++f2]=T1(shz[f1].a,v2,f1,2,shz[f1].e+1);            if(shz[f2].a==v3||shz[f2].b==v3){                ans=f2;                break;              }                   }        if(!mp[0][shz[f1].b]){            mp[0][shz[f1].b]=1;            shz[++f2]=T1(0,shz[f1].b,f1,3,shz[f1].e+1);        }        if(!mp[shz[f1].a][0]){            mp[shz[f1].a][0]=1;            shz[++f2]=T1(shz[f1].a,0,f1,4,shz[f1].e+1);        }           int a1,b1;        if(shz[f1].a<=v2-shz[f1].b)            a1=0,b1=shz[f1].b+shz[f1].a;        else{            a1=shz[f1].a-(v2-shz[f1].b);            b1=v2;        }        if(!mp[a1][b1]){            mp[a1][b1]=1;            shz[++f2]=T1(a1,b1,f1,5,shz[f1].e+1);            if(shz[f2].a==v3||shz[f2].b==v3){                ans=f2;                break;              }                   }        if(shz[f1].b<=v1-shz[f1].a)            b1=0,a1=shz[f1].b+shz[f1].a;        else{            b1=shz[f1].b-(v1-shz[f1].a);            a1=v1;        }        if(!mp[a1][b1]){            mp[a1][b1]=1;            shz[++f2]=T1(a1,b1,f1,6,shz[f1].e+1);            if(shz[f2].a==v3||shz[f2].b==v3){                ans=f2;                break;              }                   }        f1++;           }    vector<int> vect;    if(ans){        cout<<shz[ans].e<<endl;        int u=ans;        while(shz[u].c!=-1){            vect.push_back(shz[u].d);            u=shz[u].c;        }        for(int i=vect.size()-1;i>=0;i--)            cout<<str[vect[i]-1]<<endl;    }    else        printf("impossible\n");//    return 0;}
0 0
原创粉丝点击