링크: https://www.acmicpc.net/problem/2615
가볍게 풀 수 있을 줄 알았는데 고려해야 할 부분이 좀 있습니다.
대충 짜면 통과를 못하는 문제입니다.
이 문제는 오목판 보고 누가 이겼는지, 이긴 오목의 왼쪽 위 좌표는 어디인지 찾아내는 문제입니다.
6목은 안되고요, 인덱스 다룰 때 주의해서 구현하셔야 합니다.
저는 매 칸마다 돌이 4가지 방향으로 움직여서 오목이 되는지, 육목은 아닌지 체크했습니다.
#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>
using namespace std;
int arr[19][19];
const int dir[][2] = { {0,1}, {1,1}, {1, 0}, {1, -1} };
bool is_ok(int y, int x) {
return (y>=0 && x>=0 && y<19 && x<19);
}
int main(int argc, char** argv)
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL);
for (int i = 0; i < 19; ++i)
for (int j = 0; j < 19; ++j)
cin >> arr[i][j];
for (int i = 0; i < 19; ++i) {
for (int j = 0; j < 19; ++j) {
if (arr[i][j] != 0) {
for (int k = 0; k < 4; ++k) {
int win = arr[i][j];
int next_y = i, next_x = j;
for (int m = 0; m < 4; ++m) {
next_y += dir[k][0];
next_x += dir[k][1];
//boundary check
if (!is_ok(next_y, next_x)) {
win = 0;
break;
}
if (arr[i][j] != arr[next_y][next_x]) {
win = 0;
break;
}
}
if (win) {
//6목체크
int prev_y = i - dir[k][0],
prev_x = j - dir[k][1];
next_y += dir[k][0];
next_x += dir[k][1];
if (is_ok(prev_y, prev_x) && arr[prev_y][prev_x] == arr[i][j])
continue;
if (is_ok(next_y, next_x) && arr[next_y][next_x] == arr[i][j])
continue;
next_y -= dir[k][0];
next_x -= dir[k][1];
//가장 왼쪽에 있는 바둑알 찾기
int lefttop_y, lefttop_x;
if (k == 3) {
lefttop_y = next_y;
lefttop_x = next_x;
}
else {
lefttop_y = i;
lefttop_x = j;
}
cout << win << '\n'
<< lefttop_y + 1 << ' ' << lefttop_x + 1;
return 0;
}
}
}
}
}
cout << 0;
return 0;
}
인덱스 체크를 잘못 해서 푸는데 시간이 좀 걸렸네요 휘유
이 문제를 계기로 좀 꼼꼼하게 코딩하는 습관을 들여야겠습니다.
반응형
'Online Judge > 백준' 카테고리의 다른 글
[백준][C++] 14500: 테트로미노 (0) | 2020.03.26 |
---|---|
[백준][C++] 3190: 뱀 (0) | 2020.03.26 |
[백준][C++] 1939: 중량제한 (0) | 2020.03.26 |
[백준][C++] 2312: 수 복원하기 (0) | 2019.08.22 |
[백준][C++] 17413: 단어 뒤집기 2 (0) | 2019.08.22 |