Untitled
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