728x90
오목판이 주어졌을 때 현재 누가 이겼는지 구하고 가장 왼쪽의 돌을 출력합니다.
만약 아무도 이기지 않은 상태면 0을 출력합니다.
4방향으로 검사합니다.
오른쪽 대각선 위, 오른쪽, 오른쪽 대각선 아래, 아래
4칸 검사를 하고 전부 같은 색 돌이면
시작점 돌의 뒤와 4번째 돌의 다음에 현재 색과 같은 돌이
있지 않는 경우라면 오목이 완성되었다고 판단했습니다.
#include <iostream>
#include <string>
using namespace std;
bool flag = false;
int x, y;
int black = 1;
int white = 2;
int map[19][19];
int chkMove[4][6][2] = { { { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { -1, 0 }, { 5, 0 } },
{ { 0, 1 }, { 0, 2 }, { 0, 3 }, { 0, 4 }, { 0, -1 }, { 0, 5 } },
{ { 1, 1 }, { 2, 2 }, { 3, 3 }, { 4, 4 }, { -1, -1}, { 5, 5 } },
{ { -1 , 1 }, { -2, 2 }, { -3, 3 }, { -4, 4 }, { 1, -1 }, { -5, 5 } }
};
bool check(int color)
{
for (int i = 0; i < 19; ++i) {
for (int j = 0; j < 19; ++j) {
if (map[i][j] != color) {
continue;
}
for (int k = 0; k < 4; ++k) {
for (int l = 0; l < 6; ++l) {
int nextX = j + chkMove[k][l][1];
int nextY = i + chkMove[k][l][0];
if (l > 3) {
if (nextX < 0 || nextY < 0 || nextX > 18 || nextY > 18 || map[nextY][nextX] != color) {
if (l == 5) {
x = j;
y = i;
flag = true;
return true;
}
continue;
}
else {
break;
}
}
if (nextX < 0 || nextY < 0 || nextX > 18 || nextY > 18) {
break;
}
if (l < 4 && map[nextY][nextX] != color) {
break;
}
}
}
}
}
return false;
}
int main(int argc, char *argv[])
{
bool b;
bool w;
for (int i = 0; i < 19; ++i) {
for (int j = 0; j < 19; ++j) {
cin >> map[i][j];
}
}
b = check(black);
if (!flag) {
w = check(white);
}
if (b == 0 && w == 0) {
cout << 0 << endl;
}
else if (b == 1) {
cout << "1" << endl;
cout << y + 1 << " " << x + 1 << endl;
}
else {
cout << "2" << endl;
cout << y + 1 << " " << x + 1 << endl;
}
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 2641번 다각형그리기 (0) | 2019.11.06 |
---|---|
[C++] 백준 1331번 나이트 투어 (0) | 2019.11.05 |
[C++] 백준 4606번 The Seven Percent Solution (0) | 2019.11.05 |
[C++] 백준 2037번 문자메시지 (0) | 2019.11.05 |
[C++] 백준 5671번 호텔 방 번호 (0) | 2019.11.05 |