끄적끄적 코딩
article thumbnail
Published 2019. 11. 5. 22:43
[C++] 백준 2615번 오목 알고리즘
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;
}

검색 태그