Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

牛人帮忙看看哪里错了,是在找不到了

Posted by jxnuxiaoyong at 2009-09-08 16:26:05 on Problem 3414
91 100 95
这组数据我答案是210步,牛人帮忙看看哪里错了


#include <iostream>
#include <queue>
#include <string>
using namespace std;

typedef struct node
{
    int pone;  // 第一个容器还剩多少水
    int ptwo;  // 第二个容器还剩多少水
    int steps; // 一共有多少步骤
    int path;  // 是通过哪个步骤得到此状态的
    struct node *last;  // 指向前一个节点(指向 状态转换成此状态的那个状态)
}ACM,*PACM;

int data[2000000];

int visit[102][102];

string road[7]={ " "        ,
                "FILL(1)"   ,
                "FILL(2)"   ,
                "DROP(1)"   ,
                "DROP(2)"   ,
                "POUR(1,2)" ,
                "POUR(2,1)" 
              };

int main()
{
    int p1,p2,end;
    while( cin>>p1>>p2>>end )
    {
        queue<PACM> q;
        PACM pacm;
        pacm=(ACM*)malloc(sizeof(ACM));
        memset(visit,0,sizeof(visit));
        visit[0][0]=1;
        
        pacm->last=NULL;
        pacm->steps=1;
        
        pacm->pone=p1;
        pacm->ptwo=0;
        pacm->path=1;
        q.push(pacm);
        visit[p1][0]=1;
        
        pacm->pone=0;
        pacm->ptwo=p2;
        pacm->path=2;
        q.push(pacm);
        visit[0][p2]=1;
        
        int steps=1;
        int fit=0;
        
        while( !q.empty() )
        {
            pacm=q.front();
            q.pop();
            int pone=pacm->pone;
            int ptwo=pacm->ptwo;
            int path=pacm->path;
            steps=pacm->steps;
           
            if( pone==end || ptwo==end )
            {
                fit=1;
                break;
            }
            PACM Pacm;
            Pacm=(ACM*)malloc(sizeof(ACM));
            Pacm->last=pacm;
            steps++;
            Pacm->steps=steps;
            
            if( pone<p1 && !visit[p1][ptwo] )  // FILL(1)
            {
                Pacm->pone=p1;
                Pacm->ptwo=ptwo;
                Pacm->path=1;
                q.push(Pacm);
                visit[p1][ptwo]=1;
            }
            
            if( pone>0 && !visit[0][ptwo] )  // DROP(1)
            {
                Pacm->pone=0;
                Pacm->ptwo=ptwo;
                Pacm->path=3;
                q.push(Pacm);
                visit[0][ptwo]=1;
            }
            
            if( ptwo<p2 && !visit[pone][p2] ) // FILL(2)
            {
                Pacm->pone=pone;
                Pacm->ptwo=p2;
                Pacm->path=2;
                q.push(Pacm);
                visit[pone][p2]=1;
            }
            
            if( ptwo>0 && !visit[pone][0] ) // DROP(2)
            {
                Pacm->pone=pone;
                Pacm->ptwo=0;
                Pacm->path=4;
                q.push(Pacm);
                visit[pone][0]=1;
            }
            
            if( pone>0 && ptwo<p2 ) // POUR(1,2)
            {
                if( pone<p2-ptwo && !visit[0][pone+ptwo] )
                {
                    Pacm->pone=0;
                    Pacm->ptwo=pone+ptwo;
                    Pacm->path=5;
                    q.push(Pacm);
                    visit[0][pone+ptwo]=1;
                }
                if( pone>=p2-ptwo && !visit[pone-(p2-ptwo)][p2] )
                {
                    Pacm->pone=pone-(p2-ptwo);
                    Pacm->ptwo=p2;
                    Pacm->path=5;
                    q.push(Pacm);
                    visit[pone-(p2-ptwo)][p2]=1;
                }
            }
            
            if( ptwo>0 && pone<p1 ) //POUR(2,1)
            {
                if( ptwo<p1-pone && !visit[pone+ptwo][0] )
                {
                    Pacm->pone=ptwo+pone;
                    Pacm->ptwo=0;
                    Pacm->path=6;
                    q.push(Pacm);
                    visit[ptwo+pone][0]=1;
                }
                if( ptwo>=p1-pone && !visit[p1][ptwo-(p1-pone)] )
                {
                    Pacm->pone=p1;
                    Pacm->ptwo=ptwo-(p1-pone);
                    Pacm->path=6;
                    q.push(Pacm);
                    visit[p1][ptwo-(p1-pone)]=1;
                }
            }    
        }
        
        if(fit)
        {
            cout<<steps<<endl;
            int k=0;
            while( pacm )
            {
                data[k++]=pacm->path;
                pacm=pacm->last;
            }
            
            for( int i=k-1;i>=0;i--)
                cout<<road[data[i]]<<endl;
        }
        else
            cout<<"impossible"<<endl;
        
    }
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator