Untitled
unknown
plain_text
a year ago
3.6 kB
5
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