🔫 싸움땅
난이도: 골드 2
소요 시간: 50분
메모리: 9MB
시간: 101ms
- 문제에 나와있는 순서대로 차근차근 풀면 되는 문제였다.
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.LinkedList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class Main_싸움땅 {
static final int[] di = { -1, 0, 1, 0 }; // ↑, →, ↓, ←
static final int[] dj = { 0, 1, 0, -1 };
static int N, M;
static PriorityQueue<Integer>[][] map;
static int[][] players; // 0:i, 1:j, 2: 방향, 3: 능력치 , 4: 총 능력치, 5: 점수
static int[][] playerMap;
public static void main(String[] args) throws Exception {
int K = init();
while (K-- > 0) {
for (int m = 1; m <= M; m++) {
playerMap[players[m][0]][players[m][1]] = 0;
int ni = players[m][0] + di[players[m][2]];
int nj = players[m][1] + dj[players[m][2]];
if (!check(ni, nj)) {
players[m][2] = players[m][2] > 1 ? players[m][2] - 2 : players[m][2] + 2;
ni = players[m][0] + di[players[m][2]];
nj = players[m][1] + dj[players[m][2]];
}
players[m][0] = ni;
players[m][1] = nj;
if (playerMap[players[m][0]][players[m][1]] == 0) {
if (map[players[m][0]][players[m][1]].size() > 0) {
if (players[m][4] > 0) {
map[players[m][0]][players[m][1]].offer(players[m][4]);
}
players[m][4] = map[players[m][0]][players[m][1]].poll();
}
playerMap[players[m][0]][players[m][1]] = m;
} else {
int u = playerMap[players[m][0]][players[m][1]];
int me = players[m][3] + players[m][4];
int you = players[u][3] + players[u][4];
if (me > you || (me == you && players[m][3] > players[u][3])) {
players[m][5] += me - you;
setLoser(u);
setWinner(m);
} else {
players[u][5] += you - me;
setLoser(m);
setWinner(u);
}
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= M; i++) {
sb.append(players[i][5]).append(" ");
}
System.out.println(sb);
}
static int init() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
map = new PriorityQueue[N][N];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
int tmp = Integer.parseInt(st.nextToken());
map[i][j] = new PriorityQueue<>(Comparator.reverseOrder());
if (tmp > 0) {
map[i][j].offer(tmp);
}
}
}
playerMap = new int[N][N];
players = new int[M + 1][];
for (int i = 1; i <= M; i++) {
st = new StringTokenizer(br.readLine(), " ");
players[i] = new int[] { Integer.parseInt(st.nextToken()) - 1, Integer.parseInt(st.nextToken()) - 1,
Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), 0, 0 };
playerMap[players[i][0]][players[i][1]] = i;
}
return K;
}
static void setLoser(int m) {
if (players[m][4] > 0) {
map[players[m][0]][players[m][1]].offer(players[m][4]);
players[m][4] = 0;
}
int ni = players[m][0] + di[players[m][2]];
int nj = players[m][1] + dj[players[m][2]];
while (!check(ni, nj) || playerMap[ni][nj] > 0) {
players[m][2] = (players[m][2] + 1) % 4;
ni = players[m][0] + di[players[m][2]];
nj = players[m][1] + dj[players[m][2]];
}
players[m][0] = ni;
players[m][1] = nj;
if (map[players[m][0]][players[m][1]].size() > 0) {
players[m][4] = map[players[m][0]][players[m][1]].poll();
}
playerMap[players[m][0]][players[m][1]] = m;
}
static void setWinner(int m) {
if (players[m][4] > 0) {
map[players[m][0]][players[m][1]].offer(players[m][4]);
}
if (map[players[m][0]][players[m][1]].size() > 0) {
players[m][4] = map[players[m][0]][players[m][1]].poll();
}
playerMap[players[m][0]][players[m][1]] = m;
}
static boolean check(int i, int j) {
if (i < 0 || i >= N || j < 0 || j >= N)
return false;
return true;
}
}