반응형
https://www.acmicpc.net/problem/2615
2615번: 오목
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호
www.acmicpc.net
#문제 간단 정리
#문제 해결 방법
가장 주의해야될 점이 연속된5개의 돌을 확인해서 승리로 판단할 수 있지만, 만약
뒤쪽 방향도 확인하지 않는다면 육목임에도 중간부터 확인해서 오목으로 오판해서
승리로 간주할 수 있다.
때문에 뒤쪽도 확인한 뒤에 뒤의 인덱스로 업데이트 하는 기능을 신경 써 줘야 한다
#전체 코드
#include <iostream>
#include <vector>
using namespace std;
const int N = 19;
int board[N][N];
int backwardX, backwardY;
// 방향을 나타내는 배열 (가로, 세로, 대각선 오른쪽 위, 대각선 오른쪽 아래)
int dx[] = { 0, 1, 1, -1 };
int dy[] = { 1, 0, 1, 1 };
bool isValid(int x, int y) {
return x >= 0 && x < N&& y >= 0 && y < N;
}
bool checkFive(int row, int col) {
if (board[row][col] == 0) return false; // 빈 칸은 검사할 필요 없음
for (int dir = 0; dir < 4; dir++) {
int count = 1;
// 앞쪽 방향으로 연속된 돌 확인
int x = row + dx[dir];
int y = col + dy[dir];
while (isValid(x, y) && board[x][y] == board[row][col]) {
count++;
x += dx[dir];
y += dy[dir];
}
// 연속된 돌의 앞쪽 끝 검사
int forwardX = x;
int forwardY = y;
// 반대 방향으로 연속된 돌 확인
x = row - dx[dir];
y = col - dy[dir];
while (isValid(x, y) && board[x][y] == board[row][col]) {
count++;
x -= dx[dir];
y -= dy[dir];
}
// 연속된 돌의 뒤쪽 끝 검사
backwardX = x +dx[dir];
backwardY = y +dy[dir];
// 정확히 5개의 돌이 연속되는지 확인
if (count == 5) {
// 양 끝이 둘 다 유효하지 않거나, 양쪽 끝에 동일한 색의 돌이 없는 경우에만 true 반환
if ((!isValid(forwardX, forwardY) || board[forwardX][forwardY] != board[row][col]) &&
(!isValid(backwardX -dx[dir], backwardY -dy[dir]) || board[backwardX -dx[dir]][backwardY- dy[dir]] != board[row][col])) {
return true;
}
}
}
return false;
}
int main() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> board[i][j];
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (checkFive(i, j)) {
cout << board[i][j] << "\n" << backwardX + 1 << " " << backwardY + 1 << endl;
return 0;
}
}
}
cout << 0 << '\n'; // 승자 없음
return 0;
}
반응형
'[백준] > C++' 카테고리의 다른 글
백준 16139번 인간-컴퓨터 상호작용 [C++] (2) | 2024.02.25 |
---|---|
백준 1012번 유기농 배추 [C++] (0) | 2024.02.24 |
백준 12100번 2048(Easy) [C++] (1) | 2024.02.20 |
백준 15683번 감시 [C++] (0) | 2024.02.20 |
백준 2239번 스도쿠 [C++] (0) | 2024.02.20 |