PKU 1606 Jugs (ZOJ 1005 Jugs)

http://poj.org/problem?id=1606
容量aのビン?と容量bのビンを使って容量nを創りだす時の手順を出力するというような問題。

幅優先探索
時間制限はかなり緩い模様。
終了条件を適当にしていたため1OLEをくらった。

bool vis[1001][1001];

main(){
  int a,b,n;
  while(cin>>a>>b>>n){
    memset(vis,0,sizeof(vis));
    queue<pair<PI,deque<string> > > q;
    q.push(mp(mp(0,0),deque<string>()));
    while(!q.empty()){
      int ca=q.front().F.F,cb=q.front().F.S;
      deque<string> qq=q.front().S;q.pop();
      if(ca==n || cb==n){
        while(!qq.empty()){
          cout<<qq.front()<<endl;
          qq.pop_front();
        }
        cout<<"success"<<endl;
        break;
      }
      if(vis[ca][cb])continue;
      vis[ca][cb]=true;
      if(cb<b){
        qq.pb("fill B");
        q.push(mp(mp(ca,b),qq));
        qq.pop_back();
        if(ca){
          qq.pb("pour A B");
          int na=max(0,ca-(b-cb)),nb=min(ca+cb,b);
          q.push(mp(mp(na,nb),qq));
          qq.pop_back();
        }
      }
      if(ca<a){
        qq.pb("fill A");
        q.push(mp(mp(a,cb),qq));
        qq.pop_back();
        if(cb){
          qq.pb("pour B A");
          int nb=max(0,cb-(a-ca)),na=min(ca+cb,a);
          q.push(mp(mp(na,nb),qq));
          qq.pop_back();
        }        
      }
      if(ca){
        qq.pb("empty A");
        q.push(mp(mp(0,cb),qq));
        qq.pop_back();
      }
      if(cb){
        qq.pb("empty B");
        q.push(mp(mp(ca,0),qq));
        qq.pop_back();
      }
    }
  }
}

4/16追記
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5
と同じ問題のようです。