Untitled

 avatar
unknown
plain_text
5 months ago
3.6 kB
3
Indexable
#include<algorithm>
using namespace std;
#define MAX_N 100
#define MAX 101
   
int arr[MAX][MAX];
int bacteria[MAX][MAX];
int n;
int bacteria_type[3];
int visited[MAX][MAX] = { 0 };
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };
int counter = 0;
   
struct Bacteria {
    int energy;
    int row;
    int col;
};
   
Bacteria b[11000];
int idx;
   
struct cmp {
    bool operator()(Bacteria& a, Bacteria& b) {
        if (a.energy == b.energy) {
            if (a.row == b.row)return a.col > b.col;
            return a.row > b.row;
        }
        return a.energy < b.energy;
    }
};
   
void init(int N, int mDish[MAX_N][MAX_N])
{
    n = N;
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            arr[i + 1][j + 1] = mDish[i][j];
            bacteria[i + 1][j + 1] = 0;
        }
    }
    for (int i = 0; i < 3; i++) {
        bacteria_type[i] = 0;
    }
}
   
bool isValid(int x, int y) {
    if (x > 0 && x <= n && y > 0 && y <= n) {
        return true;
    }
    return false;
}
   
void addDirection(int x, int y, int target) {
    for (int i = 0; i < 4; i++) {
        int r_x = x + dx[i];
        int c_y = y + dy[i];
        if (!isValid(r_x, c_y) || visited[r_x][c_y]==counter) {
            continue;
        }
        if (bacteria[r_x][c_y] == 0) {
            b[idx++] = { arr[r_x][c_y],r_x,c_y };
            push_heap(b, b + idx, cmp());
            visited[r_x][c_y] = counter;
        }
        if (bacteria[r_x][c_y] == target) {
            visited[r_x][c_y] = counter;
            addDirection(r_x, c_y, target);
        }
    }
}
   
int dropMedicine(int mTarget, int mRow, int mCol, int mEnergy)
{
    if (bacteria[mRow][mCol] != 0 && bacteria[mRow][mCol] != mTarget) {
        return bacteria_type[mTarget];
    }
    idx = 0;
    counter++;
    if (bacteria[mRow][mCol] == 0) {
        mEnergy -= arr[mRow][mCol];
        bacteria[mRow][mCol] = mTarget;
        bacteria_type[mTarget]++;
    }
    b[idx++] = { arr[mRow][mCol],mRow,mCol };
    push_heap(b, b + idx, cmp());
    visited[mRow][mCol] = counter;
    while (idx>0) {
        auto c = b[0];
        pop_heap(b, b + idx, cmp());
        idx--;
        if (bacteria[c.row][c.col] == 0) {
            mEnergy -= c.energy;
            bacteria[c.row][c.col] = mTarget;
            bacteria_type[mTarget]++;
        }
        if (mEnergy <= 0) {
            return bacteria_type[mTarget];
        }
        if (bacteria[c.row][c.col] == mTarget) {
            addDirection(c.row, c.col, mTarget);
        }
    }
    return bacteria_type[mTarget];
}
   
int cleanBacteria(int mRow, int mCol)
{
    int t = bacteria[mRow][mCol];
    if (t == 0)return -1;
    idx = 0;
    counter++;
    b[idx++] = { arr[mRow][mCol],mRow,mCol };
    push_heap(b, b + idx, cmp());
    visited[mRow][mCol] = counter;
    while (idx>0) {
        auto temp = b[0];
        pop_heap(b, b + idx, cmp());
        idx--;
        bacteria_type[t]--;
        bacteria[temp.row][temp.col] = 0;
        for (int i = 0; i < 4; i++) {
            int x = temp.row + dx[i];
            int y = temp.col + dy[i];
            if (!isValid(x, y)) {
                continue;
            }
            if (visited[x][y]!=counter&& bacteria[x][y] == t) {
                b[idx++] = { arr[x][y],x,y };
                push_heap(b, b + idx, cmp());
                visited[x][y] = counter;
            }
        }
    }
    return bacteria_type[t];
}
Editor is loading...
Leave a Comment