[SWEA/C++] 4615 재미있는 오셀로 게임 (DFS, 쉽고 짧은 코드)
2023. 2. 12. 23:15ㆍ🧡 Programming/💻 코딩 테스트
나는 오셀로 게임을 좋아했다.
그리고 못하는 편은 아니라고 생각한다. (하지만 회사 내 어르신에게 여러 번 진 이력이 있다...)
사실 구석 4 모서리를 잘 선점하는 이기는 게임.. ㅋㅋㅋ
문제에서 주어진 오셀로 게임의 설명은 다음과 같다.
무튼 이 문제의 핵심은 흑돌과 백돌을 번갈아가면서 주어진 인풋대로 두는데
각각 돌이 몇개냐를 묻는 문제이다.
방법은 간단하다.
돌을 입력받을 때 마다 find(y_coord, x_coord, wb)를 이용하여 돌을 두고 돌 색을 바꾸면 된다.
void find(int Y, int X, int STONE) 함수를 보면 돌을 둔 위치에서 8방향을 체크한다.
돌을 두었다는 것 자체가 먹을 돌이 있다는 얘기이니까 돌을 두었을때 잡아먹을 수 있는 돌이 있는 지는 딱히 신경 쓸 필요가 없다.
그리고 8방향 중 여러 방향으로 상대방 돌이 있기만 하면 걍 바로 내 돌로 바꿔주면 된다.
(제일 끝에 상대방의 돌이 있으니까 그 돌 위치를 입력으로 준 것이다. 마지막에 내 돌이 있는지 굳이 신경쓰지 말자)
무튼 이런식으로 쭉 내 돌 깔고 상대방의 돌을 깔고
제일 마지막에 map을 돌면서 각각의 돌의 개수를 카운트 하면 된다.
#include <stdio.h>
int T, N, M; // N 한변길이, M 돌 놓는 횟수
// 1 : 흑돌 , 2 : 백돌
int map[10][10];
int dy[8] = { 0,0,1,1,1,-1,-1,-1 };
int dx[8] = { 1,-1,0,1,-1,0,1,-1 };
void setmap(int sy, int sx, int ey, int ex, int stone, int dir) {
int y = sy, x = sx;
while (true) {
if (y == ey && x == ex) break;
map[y][x] = stone;
y += dy[dir]; x += dx[dir];
}
}
void find(int Y, int X, int STONE) {
for (int d = 0; d < 8; d++) {
int ny = Y + dy[d];
int nx = X + dx[d];
if (ny<1 || nx<1 || ny>N || nx>N) continue;
if (map[ny][nx] == 0 || map[ny][nx] == STONE) continue;
while (1) {
ny += dy[d]; nx += dx[d];
if (ny<1 || nx<1 || ny>N || nx>N) break;
if (map[ny][nx] == 0) break;
if (map[ny][nx] == STONE) {
setmap(Y,X,ny,nx,STONE,d);
break;
}
}
}
}
void init() {
for (int y = 1; y <= N; y++)
for (int x = 1; x <= N; x++)
map[y][x] = 0;
map[N / 2][N / 2] = 2;
map[(N / 2) + 1][(N / 2) + 1] = 2;
map[(N / 2) + 1][N / 2] = 1;
map[N / 2][(N / 2) + 1] = 1;
}
int main() {
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++) {
scanf("%d %d", &N, &M);
init();
int y_coord, x_coord, wb;
for (int c = 1; c <= M; c++) {
scanf("%d %d %d", &x_coord, &y_coord, &wb);
find(y_coord, x_coord, wb);
}
int cnt1=0, cnt2=0;
for (int y = 1; y <= N; y++) {
for (int x = 1; x <= N; x++) {
if (map[y][x] == 1) cnt1++;
if (map[y][x] == 2) cnt2++;
}
}
printf("#%d %d %d\n", tc, cnt1, cnt2);
}
return 0;
}
'🧡 Programming > 💻 코딩 테스트' 카테고리의 다른 글
[백준/C++] 17142 연구소3 (BFS) (0) | 2023.02.18 |
---|---|
[백준/C++] 14500 테트로미노 (DFS) (0) | 2023.02.15 |
[ 백준/C++] 17472 다리만들기2 (삼성A형 기출문제,BFS,DFS 이용하기) (0) | 2023.02.12 |
[백준/C++] 7576번 토마토 (BFS기초문제, 방문체크 순서, vector 사용하면 안되는 이유) (0) | 2023.02.11 |
[백준/C++] 17143번 낚시왕 (반례 케이스) (0) | 2023.02.11 |