Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 프로그래머스
- Baekjoon
- ICPC
- bixby studio
- Network Flow
- 이분탐색
- BOJ
- SQL
- INNER JOIN
- SDS 알고특강
- 네트워크 플로우
- 최대 유량
- 후기
- 빅스비
- backjoon
- maximum flow
- 빅스비 스튜디오
- 백준
- JOIN
- SWTest
- 메모이제이션
- 삼성
- 분할정복
- 세그먼트트리
- 최대유량
- 코딩테스트
- DP
- SWEA
- 알고리즘
- 완전탐색
Archives
- Today
- Total
답은 알고리즘 뿐이야!
[BOJ 15671] 오델로 본문
문제 출처 : https://www.acmicpc.net/problem/15671
풀이 :
문제 조건이 시키는대로 짜면 되는 문제입니다. (시뮬레이션...? 구현...?)
문제에 주어진 인풋대로 하면 무조건 정상적인 게임으로 성립이 됩니다.
조건
1. 처음 상태는 {{W,B},{B,W}}이다.
2. 돌은 반드시 포위하여 뒤집을 수 있는 곳에 놓아야 한다.
3. 돌을 뒤집을 수 없으면 상대 차례로 넘어간다.
2번 조건이 제일 중요한 조건으로 돌을 놓은 곳부터 2번조건을 성립시킬 수 있는 돌이 있는 곳까지 다 뒤집어 주되,
그 사이에 빈칸이 있으면 안됨을 고려해서 짜면 됩니다.
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
|
#include<stdio.h>
#include<stack>
using namespace std;
typedef pair<int, int> p;
int n, a, b, arr[7][7], dx[8] = { 1,-1,0,0,1,1,-1,-1 }, dy[8] = { 0,0,1,-1,1,-1,1,-1 }, bcnt, wcnt;
stack<p> s;
bool check(int y, int x, int w) {
bool ret = false;
arr[y][x] = w;
for (int k = 0; k < 8; k++) {
int ny = y + dy[k], nx = x + dx[k];
if (ny == 0 || ny == n + 1 || nx == 0 || nx == n + 1 || !arr[ny][nx])continue;
if (arr[ny][nx] != w) {
int tmpy = ny + dy[k], tmpx = nx + dx[k];
s.push({ ny,nx });
for (; tmpy > 0 && tmpy < 7 && tmpx > 0 && tmpx < 7;) {
if (!arr[tmpy][tmpx])break;
if (arr[tmpy][tmpx] == w)
{
while (!s.empty()) {
int cy = s.top().first, cx = s.top().second;
s.pop();
arr[cy][cx] = w;
}
ret = true;
break;
}
s.push({ tmpy,tmpx });
tmpy += dy[k];
tmpx += dx[k];
}
while (!s.empty())s.pop();
}
}
return ret;
}
int main() {
scanf("%d", &n);
arr[3][3] = arr[4][4] = 1;
arr[3][4] = arr[4][3] = 2;
for (int i = 1; i <= n; i++) {
scanf("%d %d", &a, &b);
check(a, b, i % 2 + 1);
}
for (int i = 1; i <= 6; i++, printf("\n"))for (int j = 1; j <= 6; j++) {
if (arr[i][j] == 0)printf(".");
else if (arr[i][j] == 1) {
printf("W");
wcnt++;
}
else {
printf("B");
bcnt++;
}
}
if (wcnt > bcnt)printf("White");
else printf("Black");
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
'알고리즘 > 백준문제풀이' 카테고리의 다른 글
[BOJ 13511] 트리와 쿼리 2 (0) | 2020.02.19 |
---|---|
[BOJ 14247] 나무 자르기 (0) | 2020.02.14 |
[BOJ 3006] 터보소트 (0) | 2020.02.11 |
[BOJ 18111] 마인크래프트 (0) | 2020.02.10 |
[BOJ 6549] 히스토그램에서 가장 큰 직사각형 (0) | 2020.02.10 |
Comments