Untitled
unknown
plain_text
a year ago
2.5 kB
18
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