Untitled

 avatar
unknown
plain_text
10 months ago
2.5 kB
6
Indexable
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

#define MAX_HEIGHT 1001
#define MAX_WIDTH 200001
#define MAX_BOX 10001
#define INF 99999999

struct Space {
    int id, row;
    bool haveExit;
};

Space space[MAX_WIDTH];
vector<int> graph[MAX_BOX];

int visit[MAX_BOX];

void init(int mH, int mW)
{
    for(int i = 0; i < mW; i++) {
        space[i].id = -1;
        space[i].row = mH;
        space[i].haveExit = 0;
    }
    for(int i = 0; i < MAX_BOX; i++) {
        graph[i].clear();
        visit[i] = 0;
    }
}

int dropBox(int mId, int mLen, int mExitA, int mExitB, int mCol)
{
    int rowTarget = INF;
    for(int i = mCol; i < mCol + mLen; i++) {
        rowTarget = min(rowTarget, space[i].row);
    }
    rowTarget--;
    
    if(space[mCol + mExitA].row == rowTarget + 1 && space[mCol + mExitA].id != -1) { // Check exitA of above box(mId)
        graph[mId].push_back(space[mCol + mExitA].id);
    }

    if(space[mCol + mExitB].row == rowTarget + 1 && space[mCol + mExitB].id != -1) { // Check exitB of above box(mId)
        graph[mId].push_back(space[mCol + mExitB].id);
    }

    if(mCol != 0 && space[mCol - 1].row == rowTarget) { // Check left box(mID)
        graph[mId].push_back(space[mCol - 1].id);
        graph[space[mCol - 1].id].push_back(mId);
    }

    if(space[mCol + mLen].row == rowTarget) { // Check right box(mId)
        graph[mId].push_back(space[mCol + mLen].id);
        graph[space[mCol + mLen].id].push_back(mId);
    }

    for(int i = mCol; i < mCol + mLen; i++) {
        if(space[i].row == rowTarget + 1 && space[i].haveExit) {
            graph[space[i].id].push_back(mId);
        }
        // Update id, rowMax, haveExit at all position of box(mId) in space
        space[i].id = mId;
        space[i].row = rowTarget;
        if(i == mCol + mExitA || i == mCol + mExitB) {
            space[i].haveExit = 1;
        } else {
            space[i].haveExit = 0;
        }
    }
    return rowTarget;
}

int explore(int mIdA, int mIdB) {
    queue<pair<int, int>> pq;
    pq.push(make_pair(1, mIdA));
    visit[mIdA] = 1;

    while(!pq.empty()) {
        pair<int, int> temp = pq.front();
        pq.pop();
        int cnt = temp.first;
        int boxCur = temp.second;
        
        if(boxCur == mIdB) return cnt;
        
        for(int boxId : graph[boxCur]) {
            if(!visit[boxId]) {
                pq.push(make_pair(cnt + 1, boxId));
                visit[boxId] = 1; // Mark as visited
            }
        }
    }
    return -1;
}
Editor is loading...
Leave a Comment