uva 10603 Fill

来源:互联网 发布:淘宝卖家有什么好软件 编辑:程序博客网 时间:2024/06/04 17:44

竞赛入门经典的隐式图遍历,烧杯倒水,这种题和8数码蛮像的,但是都不是很熟练、、、、而且细节方面实在是做得很不好!想办法改一下粗心的习惯

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int maxv=200+10;const int maxn=maxv*maxv;int t,d,front,rear;int parent[maxn],dis[maxn],cup[3];int state[maxn][3];int v[maxv][maxv];void init(){    memset(v,0,sizeof(v));}int fill(int b[],int i,int j){    int temp=b[i]+b[j];    if(temp>cup[j])    {        int num=cup[j]-b[j];        b[j]=cup[j];        b[i]=temp-b[j];        return num;    }    else    {        int num=b[i];        b[i]=0;        b[j]=temp;        return num;    }}int bfs(){    init();    front=0,rear=1;    state[0][0]=0,state[0][1]=0,state[0][2]=cup[2];    parent[0]=-1;    if(cup[2]==d) return 0;    v[0][0]=1;    while(front<rear)    {        int s[3],ns[3];        memcpy(s,state[front],sizeof(s));        for(int i=0;i<3;i++)            if(s[i])//have water            {                for(int j=0;j<3;j++)                    if(i!=j)//not the same jug                    {                        memcpy(ns,s,sizeof(s));                        int dist=fill(ns,i,j);                        //if(dist<0) printf("dist:%d  rear:%d\n",dist,rear);                        //else printf("rear %d\n",rear);                        int x=ns[0],y=ns[1];                        if(!v[x][y])                        {                            v[x][y]=1;//一开始居然连这个都忘了,还debug了半天,我真服了我自己                            dis[rear]=dist;//从front到rear倒水的数目                            parent[rear]=front;                            memcpy(state[rear],ns,sizeof(ns));                            for(int k=0;k<3;k++)                                {                                    if(ns[k]==d)                                    {                                        return rear;                                    }                                }                                rear++;                        }                    }            }            front++;    }    return -1;}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d",&cup[0],&cup[1],&cup[2],&d);        int st=bfs(),mindis=maxv;        int sum=0;        if(st!=-1)        {                while(st!=-1)                {                    sum+=dis[st];                    st=parent[st];                }                printf("%d %d\n",sum,d);        }        else        {            int x,y;            for(int i=0;i<rear;i++)                for(int j=0;j<3;j++)                    if(d>state[i][j])                    {                        if(d-state[i][j]<mindis)                        {                            mindis=d-state[i][j];                            x=i;                            y=j;                        }                    }            for(int i=1;i<=x;i++)               sum+=dis[i];            printf("%d %d\n",sum,d-mindis);        }    }    return 0;}


原创粉丝点击