1 solutions

  • 0
    @ 2025-11-5 15:08:02

    C++ :

    #define FOR_EACH(i,c) for(auto (i) = (c).begin(); (i) != (c).end(); (i)++)
    #include<algorithm>
    //#include<array>
    #include<bitset>
    #include<complex>
    #include<deque>
    //#include<forward_list>
    #include<functional>
    #include<iostream>
    #include<limits>
    #include<list>
    #include<map>
    #include<string.h>
    #include<numeric>
    #include<queue>
    #include<set>
    #include<stack>
    #include<utility>
    #include<vector>
    
    const long double PI = 2*acos(.0L);
    typedef long long LLONG;
    typedef unsigned long long ULLONG;
    using namespace std;
    
    short a, b, c;
    int f[1000][1000];
    bool bingo, inQ[1000][1000];
    queue<pair<short, short>> q;
    
    bool relax(pair<short, short> u, pair<short, short> v) {
      if(f[u.first][u.second]+1 >= f[v.first][v.second])
        return 0;
      f[v.first][v.second] = f[u.first][u.second]+1;
      if((v.first==0 && v.second==c) || (v.first==c && v.second==0)) {
        printf("%d\n", f[v.first][v.second]);
        bingo = 1;
        return 1;
      }
      if(!inQ[v.first][v.second]) {
        q.push(v);
        inQ[v.first][v.second] = 1;
      }
      return 0;
    }
    
    int main() {
      while(~scanf("%hd%hd%hd", &a, &b, &c)) {
        bingo = 0;
        memset(f, 0x7f, sizeof(f));
        f[0][0] = 0;
        memset(inQ, 0, sizeof(inQ));
        inQ[0][0] = 1;
        while(q.size())
          q.pop();
        q.push(make_pair(0, 0));
        while(q.size()) {
          pair<short, short> u = q.front();
          short t0;
          q.pop();
          inQ[u.first][u.second] = 0;
          if(relax(u, make_pair(0, u.second)))
            break;
          if(relax(u, make_pair(a, u.second)))
            break;
          if(relax(u, make_pair(u.first, 0)))
            break;
          if(relax(u, make_pair(u.first, b)))
            break;
          t0 = min(u.first+0, b-u.second);
          if(relax(u, make_pair(u.first-t0, u.second+t0)))
            break;
          t0 = min(a-u.first, u.second+0);
          if(relax(u, make_pair(u.first+t0, u.second-t0)))
            break;
        }
        if(!bingo)
          puts("No solution!");
      }
      return 0;
    }
    
    
    • 1

    Information

    ID
    16435
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By