반응형
https://www.acmicpc.net/problem/5213
문제를 푸는데 작은 부분에서 많이 해매었던 문제다.
도미노 판을 표시하는 Map과 각각의 도미노의 번호를 표시하는 맵을 만들면된다.
물론 도미노의 크기는 1*2 크기이므로 Map도 Map[N][N*2] 가 만들어져야한다.
받을 때는 홀수와 짝수행에 신경을 써야한다. 그러면 지그재그로는 어떻게 놔둘것인가 ??
0이라는 값은 비어잇는 공간처럼 사용하면된다 마침 도미노의 크기는 1부터 시작된다.
이렇게 놔두면 BFS를 이용해서 사방 탐색을 할수가 있다.
여기서 내가 생각을 짧게한 실수는 봐로 운선위큐를 활용해서 Cnt 움직인 횟수에 간한 값을 q에 넣어주면
만약 1이라는 도미노는 left right로 구분된다. 이때 q에 left만 들어와잇을 때 right로 가는 값은 경로에 표시하면 안된다. 나는 우선순위 큐를 사용하면 left 큐를 처리하고 right큐를 바로처리한다고 차각햇다 ..
하지만 right큐는 다른 q를 처리하고 오는 경우가 있으므로 경로가 이상하게 쌓일수가 있다.
따라서 도미노는 하나의 큐에 두값을 동시에 넣어야 된다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Stack;
import java.util.StringTokenizer;
public class B5213 {
static int N;
static int E;
static int map[][];
static int p[][];
static int rought[];
static int dy[] = { 1, -1, 0, 0 };
static int dx[] = { 0, 0, 1, -1 };
static class Pair {
int y;
int x;
public Pair(int y, int x) {
super();
this.y = y;
this.x = x;
}
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
map = new int[N][N * 2];
p = new int[N][N * 2];
rought = new int[N * N - N / 2 + 1];
int num = 1;
int start = 0;
for (int i = 0; i < N; i++) {
int e = i % 2 == 0 ? N : N - 1;
int j = i % 2 == 0 ? 0 : 1;
for (int ee = 0; ee < e; ee++) {
st = new StringTokenizer(br.readLine());
p[i][j] = num;
map[i][j++] = Integer.parseInt(st.nextToken());
p[i][j] = num++;
map[i][j++] = Integer.parseInt(st.nextToken());
}
}
boolean visit[][] = new boolean[N][N * 2];
Queue<Pair> q = new LinkedList<>();
q.add(new Pair(0, 0));
q.add(new Pair(0, 1));
visit[0][0] = true;
visit[0][1] = true;
while (!q.isEmpty()) {
Pair cur = q.poll();
if (p[cur.y][cur.x] > start) {
start = p[cur.y][cur.x];
}
if (cur.y == N - 1 && cur.x == N * 2 - 2) {
break;
}
int y = cur.y;
int x = cur.x;
for (int d = 0; d < 4; d++) {
int ny = y + dy[d];
int nx = x + dx[d];
if (ny < 0 || nx < 0 || ny >= N || nx >= N * 2)
continue;
if (visit[ny][nx])
continue;
if (p[ny][nx] == 0)
continue;
if (map[y][x] != map[ny][nx])
continue;
int nnx = 0;
if (ny % 2 == 0) {
if (nx % 2 == 0) {
nnx = nx + 1;
} else {
nnx = nx - 1;
}
} else {
if (nx % 2 == 0) {
nnx = nx - 1;
} else {
nnx = nx + 1;
}
}
visit[ny][nx] = true;
visit[ny][nnx] = true;
q.add(new Pair(ny,nnx));
q.add(new Pair(ny, nx));
rought[p[ny][nx]] = p[y][x];
}
}
Stack<Integer> stack = new Stack<Integer>();
stack.add(start);
while (start != 1) {
start = rought[start];
stack.add(start);
}
StringBuilder sb = new StringBuilder();
while (!stack.isEmpty()) {
}
System.out.print(sb.toString());
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
반응형
'ProgramSoliving' 카테고리의 다른 글
백준 : 10775 (0) | 2020.04.15 |
---|---|
백준 : 1637 (0) | 2020.04.15 |
백준 : 12886 (0) | 2020.03.15 |
백준 : 1086 JAVA (0) | 2020.03.14 |
백준 : 16946 (0) | 2020.03.11 |