POJ 3414 dfs倒水问题

来源:互联网 发布:python class 转 json 编辑:程序博客网 时间:2024/06/12 01:23

题意:这个题目的话意思就是有几种倒水方式,看你怎么倒水可以倒出来有一个瓶子的水恰好是多少升,或者同时满足,输出最少的操作次数并且输出方式

这个题目看起来好像是一道模拟题,其实不然,这是一道dfs搜索题,只不过看起来好像无从下手,其实想想就好了,我们可以用一个vis数组来保存当前的状态如果之前某一次倒水出现过这种情况,我们就无需再次去遍历这种情况,只需要遍历其他情况就好了,还有一个重要的剪枝就是假如说我们已经找到某一种情况可以到达目标状态,那么深度再深的我们就无需再次去遍历,因为绝对不是最优解。

下面给出代码仅供参考:

#include<cstdio>#include<cstring>int a,b,c,t,vis[105][105];char s[205][15],s2[205][15],choice[][10]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};void dfs(int n,int m,int deep){    int dn,dm,i,j;    if(deep>=t) return;    if(n==c||m==c){        t=deep;        for(i=0;i<t;i++)            strcpy(s2[i],s[i]);    }    strcpy(s[deep],choice[0]);    if(!vis[a][m]){        vis[a][m]=1;        dfs(a,m,deep+1);        vis[a][m]=0;    }    strcpy(s[deep],choice[1]);    if(!vis[n][b]){        vis[n][b]=1;        dfs(n,b,deep+1);        vis[n][b]=0;    }    strcpy(s[deep],choice[2]);    if(!vis[0][m]){        vis[0][m]=1;        dfs(0,m,deep+1);        vis[0][m]=0;    }    strcpy(s[deep],choice[3]);    if(!vis[n][0]){        vis[n][0]=1;        dfs(n,0,deep+1);        vis[n][0]=0;    }    strcpy(s[deep],choice[4]);    if(b-m>=n){ dn=0; dm=m+n; }    else { dn=n-(b-m); dm=b; }    if(!vis[dn][dm]){        vis[dn][dm]=1;        dfs(dn,dm,deep+1);        vis[dn][dm]=0;    }    strcpy(s[deep],choice[5]);    if(a-n>=m){ dm=0; dn=m+n; }    else { dm=m-(a-n); dn=a; }    if(!vis[dn][dm]){        vis[dn][dm]=1;        dfs(dn,dm,deep+1);        vis[dn][dm]=0;    }}int main(void){    int i;    while(scanf("%d %d %d",&a,&b,&c)!=EOF){        t=1000000000;        memset(vis,0,sizeof(vis));        dfs(0,0,0);        if(t==1000000000) printf("impossible\n");        else{            printf("%d\n",t);            for(i=0;i<t;i++)                printf("%s\n",s2[i]);        }    }}


0 0
原创粉丝点击