SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제 접근법: 저는 오델로 게임을 별로 안해봤지만 대충 규칙은 알고있었는데
처음 중앙에 흑백이 2점씩 깔려있다는걸 처음 알았네요 둘수있는곳에만 둘수있는곳에만 둘수있고 선수권이 다른차례 인지 일일이 확인할 필요없이 입력조건에 올바른 입력만 들어오기때문에 이런생각을 하나도 안해도 되기때문에
흑을 두게되면 백돌들을 자신의 기준으로 좌우상하 대각선방향 8방향이 바뀔수있는지 확인해서 바뀌면되고 혹은 백돌을 두게 되면 흑돌과 마찬가지로 구현하면됩니다. 조건은 8방향중에 나와 다른 색을 계속 만나다가 나자신과 똑같은 색을 만나게되면 만났던 다른색들을 바꾸면되고 만나지 못한다면 바꾸면 안됩니다. 이조건만 해결하면 문제는 쉽게풀립니니다.
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
|
//By 콩순이냉장고
#include <string>
#include <vector>
#include <unordered_map>
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int board[9][9];
int n, m;
int dy[8] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dx[8] = { -1, 0, 1, -1, 1, -1, 0, 1 };
void print(){//제대로 바뀌는지 출력해보기 그냥만들었습니다.
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
cout << board[i][j] << " ";
cout << endl;
}
cout << endl;
}
void init()//중앙에 흑백 2점씩 깔기
{
int y = n / 2;
int x = n / 2;
board[y][x] = 2;
board[y][x + 1] = 1;
board[y + 1][x] = 1;
board[y + 1][x + 1] = 2;
}
bool isrange(int y, int x){
if (1 <= y&&y <= n && 1 <= x&&x <= n)
return true;
return false;
}
void change(int y, int x, int color){
vector<vector<pair<int, int>>> v;//바꿔야할 좌표들을 저장 한번에 다바꾸기위한것을 표현하기위해
for (int i = 0; i < 8; i++)
{
int ny = y + dy[i];
int nx = x + dx[i];
int flag = 0;//자신의 컬러를 만났다면 바꿀수있음
vector<pair<int, int>> v2;//바꿔야할 것들을표시
while (isrange(ny, nx) && color != board[ny][nx] && board[ny][nx] != 0)
{
v2.push_back({ ny, nx });//우선 바꿀거라고 예상하고 보이는 점들을 넣어줌
ny += dy[i];
nx += dx[i];
if (board[ny][nx] == color)//같은 색상을 만났다면 같은색상을 만나지 않았다면 끝에는 벽이라는 뜻임
flag = 1;
}
if (flag)//같은색상을 만났으니 v에 넣어줌
v.push_back(v2);
}
for (int i = 0; i < v.size(); i++)//인제 바꿔야할 색상들을 바꿔줌
{
for (int j = 0; j < v[i].size(); j++)
{
y = v[i][j].first;
x = v[i][j].second;
board[y][x] = color;
}
}
}
void Count(int *cnt){//흑백 개수세기
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cnt[board[i][j]]++;
}
}
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int te;
cin >> te;
for (int test = 1; test <= te; test++)
{
memset(board, 0, sizeof(board));
cin >> n >> m;
init();
for (int i = 0; i < m; i++)
{
int y, x, c;
cin >> y >> x >> c;
board[y][x] = c;
change(y, x, c);
}
int cnt[3] = { 0 };
Count(cnt);
cout << "#" << test << " " << cnt[1] << " " << cnt[2] << "\n";
}
}
|
cs |
모르는것 혹은 궁금한점 혹은 어딘가 풀이에 잘못된점이 있다면
언제든 댓글을 이용해주시길 바랍니다.
'SWEA' 카테고리의 다른 글
[SWEA] 4013 특이한 자석 (모의 SW 역량테스트) (0) | 2020.09.27 |
---|---|
[SWEA] 9940 순열1 (0) | 2020.09.15 |
[SWEA] 7792 반장 선출 (0) | 2020.09.15 |
[SWEA] 9708 가장 긴 수열 (0) | 2020.08.11 |
[SWEA] 10059 유효기간 (0) | 2020.08.11 |