티스토리 뷰
문제
https://www.acmicpc.net/problem/1430
다솜이는 누구나 쉽게 게임을 만들 수 있도록 하기 위해 Microsoft에서 출시한 XNA Game Studio Express를 가지고 게임을 만들었다.
다솜이의 게임은 적의 공격에 대비해서 도시를 방어하는 게임이다. 도시에는 탑이 N개가 있다. 각각의 탑은 X-Y좌표 평면위에 존재한다. 또, 탑은 맨 처음에 D의 에너지를 가지고 있고, 탑의 사정거리는 R이다.
탑 주변에 적이 나타나면, 탑은 적을 다음과 같은 방법으로 공격할 수 있다.
일단, 탑은 자신의 에너지를 재분배할 수 있다. 만약 서로 다른 두 탑의 거리가 R보다 작거나 같다면, 둘 중에 한 탑은 다른 탑에게 에너지를 자기가 가지고 있는 한도내에서 자유롭게 전송할 수 있다. 하지만, 에너지를 전송할 때는, 절반을 잃는다. (탑 1이 탑 2에게 에너지를 10 전송하면, 탑 1은 에너지를 10을 잃고, 탑 2는 에너지를 5 얻는다.)
탑이 적을 공격할 때는, 적과 탑의 거리가 R보다 작거나 같아야한다. 탑에서 적을 공격할 때는, 자신의 모든 에너지를 적을 공격하는데 쓴다. 이때 적이 받는 데미지는 에너지의 양과 같다.
적이 받을 수 있는 에너지의 최댓값을 구하는 프로그램을 작성하시오.
유형 : BFS
접근 방식
- 적의 위치를 기준으로 몇 번에 각 지점에 도달하는지에 따라 데미지 계산
전체 코드
import java.util.*;
import java.io.*;
public class BOJ_1430_공격 {
static int n;
static double r,d,x,y;
static double[][] graph;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
n = Integer.parseInt(st.nextToken());
r = Double.parseDouble(st.nextToken());
d = Double.parseDouble(st.nextToken());
x = Double.parseDouble(st.nextToken());
y = Double.parseDouble(st.nextToken());
graph = new double[n+1][2];
for(int i = 1 ; i <= n ; i++) {
st = new StringTokenizer(br.readLine()," ");
graph[i][0] = Double.parseDouble(st.nextToken());
graph[i][1] = Double.parseDouble(st.nextToken());
}
boolean[] v = new boolean[n+1];
Queue<Node> q = new ArrayDeque<>();
q.add(new Node(x,y,0));
double result = 0;
while(!q.isEmpty()) {
Node cur = q.poll();
for(int i = 1 ; i <= n ; i++) {
boolean canGo = cal(cur.x,cur.y,graph[i][0],graph[i][1]);
if(canGo && !v[i]) {
v[i] = true;
if(cur.count == 0) {
result += d;
}
else {
result += (d / Math.pow(2,cur.count));
}
q.add(new Node(graph[i][0],graph[i][1],cur.count + 1));
}
}
}
System.out.println(result);
br.close();
}
static boolean cal(double x1, double y1, double x2, double y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2)) <= r;
}
static class Node {
double x;
double y;
int count;
Node(double x, double y, int count) {
this.x = x;
this.y = y;
this.count = count;
}
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 19951 (태상이의 훈련소 생활) - java (0) | 2024.12.03 |
---|---|
백준 17822 (원판 돌리기) - java (0) | 2024.12.02 |
백준 28018 (시간이 겹칠까?) - java (1) | 2024.09.26 |
백준 6506 (엘 도라도) - java (2) | 2024.09.25 |
백준 24888 (노트 조각) - java (2) | 2024.09.22 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바
- 백준
- 백준 #1727 #커플 만들기 #자바 #java
- 백준 #25195 #yes or yes #java #자바
- 17394
- 17218
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #1584 #게임 #java #자바
- 백준 #4963 #섬의 개수
- 자바 #JAVA
- 백준 #2636 #치즈
- 백준 #치즈 #2638
- 백준 #17940 #주식 #자바 #java
- 백준 #15686 #치킨 배달
- 백준 #1325 #효율적인 해킹
- 백준 #3980 #선발 명단
- 백준 #18405 #경쟁적 전염
- 백준 #5721 #사탕 줍기 대회 #java #자바
- Java
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #16973 #직사각형 탈출
- 백준 #다리 만들기 #2146
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #2580 #스도쿠
- 백준 #인구 이동 #16234
- 백준 #1759 #암호 만들기
- 백준 #
- 백준 #12014 #주식 #자바 #java
- 백준 #1987 #알파벳 #자바 #java
- 백준 #13549 #숨바꼭질3
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함