Untitled
unknown
plain_text
a year ago
3.4 kB
9
Indexable
#include <queue>
#include <vector>
#include <set>
#include <iostream>
#define MAX_N 100
using namespace std;
int map[MAX_N + 1][MAX_N + 1]; // Mảng lưu giá trị năng lượng của từng ô
int visit[MAX_N + 1][MAX_N + 1]; // Mảng đánh dấu ô đã được thăm
int attend[MAX_N + 1][MAX_N + 1]; // Mảng đánh dấu ô đã được đưa vào hàng đợi
struct cmp {
bool operator()(pair<int, int> a, pair<int, int> b) {
if (map[a.first][a.second] == map[b.first][b.second]) {
if (a.first == b.first) {
return a.second > b.second;
}
return a.first > b.first;
}
return map[a.first][a.second] > map[b.first][b.second]; // Sửa lại để ưu tiên giá trị năng lượng nhỏ hơn
}
};
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> pq;
set<pair<int, int>> medicine[3]; // Lưu vị trí của các loại vi khuẩn
int dx[4] = {-1, 0, 1, 0}; // Di chuyển theo 4 hướng
int dy[4] = {0, 1, 0, -1};
int n;
int step;
void init(int N, int mDish[MAX_N][MAX_N]) {
n = N;
step = 1;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
map[i][j] = mDish[i - 1][j - 1]; // Chỉnh lại để truy cập đúng chỉ số từ 0-based mDish
visit[i][j] = 0;
attend[i][j] = 0;
}
}
}
int dropMedicine(int mTarget, int mRow, int mCol, int mEnergy) {
int e = mEnergy;
// Kiểm tra ô ban đầu, nếu chưa được thăm
if (visit[mRow][mCol] == 0) {
e -= map[mRow][mCol]; // Trừ năng lượng tại ô hiện tại
visit[mRow][mCol] = step++; // Đánh dấu ô đã thăm
attend[mRow][mCol] = 1; // Đánh dấu ô đã được thêm vào hàng đợi
medicine[mTarget].insert(make_pair(mRow, mCol)); // Thêm ô vào danh sách loại vi khuẩn
}
// Đẩy các ô lân cận vào priority_queue
for (int k = 0; k < 4; k++) {
int nx = mRow + dx[k];
int ny = mCol + dy[k];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && !attend[nx][ny]) {
attend[nx][ny] = 1;
pq.push(make_pair(nx, ny));
}
}
// Xử lý việc rải thuốc dựa trên năng lượng còn lại và priority_queue
while (e > 0 && !pq.empty()) {
auto topPair = pq.top();
pq.pop();
int r = topPair.first;
int c = topPair.second;
if (!visit[r][c]) { // Kiểm tra xem ô này có bị thăm hay chưa
visit[r][c] = step++;
medicine[mTarget].insert(make_pair(r, c));
e -= map[r][c]; // Trừ năng lượng tại ô hiện tại
// Nếu năng lượng còn, tiếp tục thêm các ô lân cận vào hàng đợi
if (e > 0) {
for (int k = 0; k < 4; k++) {
int nx = r + dx[k];
int ny = c + dy[k];
if (nx >= 1 && nx <= n && ny >= 1 && ny <= n && !attend[nx][ny]) {
attend[nx][ny] = 1;
pq.push(make_pair(nx, ny));
}
}
}
}
}
// Trả về số lượng ô bị vi khuẩn loại mTarget xâm chiếm
return medicine[mTarget].size();
}
int cleanBacteria(int mRow, int mCol) {
// Tạm thời trả về -1
return -1;
}
Editor is loading...
Leave a Comment