문제출처: https://www.acmicpc.net/problem/12759
문제
틱택토(Tic-Tac-Toe)는 오목과 아주 유사한 형태의 보드게임이다.
게임 방법은 아래와 같다.
- 종이 위에 가로줄 2줄 세로줄 2줄을 그린다.
- 이렇게 생긴 9칸 위의 빈칸에 플레이어 1은 O, 플레이어 2는 X를 번갈아가며 그린다.
- 먼저 O 또는 X를 3개가 직선으로 이어지게 하면 승리하고 게임이 끝난다.
- 이어지는 직선이 없고, 더는 그릴 빈칸이 없으면 무승부로 게임이 종료된다.
남녀노소 모두 즐길 수 있는 아주 쉬운 게임이지만, 중간에 끝났는지 눈치를 못 채고 계속하는 경우가 있다. 그래서 당신은 제3의 공정하고 자비 없는 냉정한 심판을 두고 싶었다.
각 플레이어가 교대로 O 또는 X를 그린 위치가 입력되면 누가 언제 이기는지를 출력하는 프로그램을 작성하시오.
입력
첫째 게임을 먼저 시작할 플레이어의 번호가 입력된다. 플레이어의 번호는 1 또는 2이다.
다음 9개의 줄에 게임이 끝날 때까지 번갈아가며 어느 위치에 그렸는지 좌표가 입력된다. 좌표는 가로 행, 세로 열의 순으로 입력된다. 가장 왼쪽 위는 (1, 1), 가장 오른쪽 아래는 (3, 3)이다.
이미 입력된 좌표가 주어지는 경우는 없으며, 항상 게임이 끝나는 입력만 주어진다.
출력
승자가 결정되는 즉시 이긴 플레이어의 번호를 출력한다. 플레이어의 번호는 1 또는 2이다. 무승부라면 0을 출력한다.
풀이
빙고게임처럼 단순한 구현문제이지만 쉽게 구현하지못했고 다른 분의 코드를 참조했습니다.ㅠㅠ
참조: https://hsdevelopment.tistory.com/213?category=1013710
입력을 받을 때 마다 승부의 여부를 확인합니다. 이 때 25행~28행 처럼 코드를 작성하면 입력을 받고 승부의 여부를 확인했을 때 그 이후의 모든 승부를 확인하지않게됩니다. 문제에서 "승부를 찾는 즉시 출력한다"를 만족합니다.(문제가 모호합니다. "승부를 찾는 즉시 출력한다"가 바로 출력하는게 아니라 승부 확인 후 "그 이후의 모든 연산을 하지않는다"로 해석해야합니다.) 승부는 행,열,대각선(좌->우, 우->좌) 모두 확인합니다.(브루트포스)
게임판의 크기는 [3][3]이지만 시작 좌표는 1,1 이므로 x,y의 index만 조심하면될 것 같습니다.
코드
#include<iostream> int map[3][3]; using namespace std; int func(int x); int main() { int num; cin >> num; int x, y; int value; int ans = 0; bool check = false; //num이1이면O표시, 2이면X표시 for (int i = 0; i < 9; i++) { if (i % 2 == 0)value = num; else { if (num == 2)value = 1; else value = 2; } cin >> x >> y; x--, y--; map[x][y] = value; if (!check) { ans = func(value); if (ans != 0)check = true; } } cout << ans << endl; } int func(int x) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (map[i][j] != x)break; if (j == 2)return x; } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (map[j][i] != x)break; if (j == 2)return x; } } for (int i = 0; i < 3; i++) { if (map[i][i] != x)break; if (i == 2)return x; } for (int i = 0; i < 3; i++) { if (map[i][2 - i] != x)break; if (i == 2)return x; } return 0; }
결과
'문제풀이(BOJ) > 시뮬레이션(구현)' 카테고리의 다른 글
[백준 11507] 카드셋트 (0) | 2020.01.08 |
---|---|
[백준 9455] 박스 (0) | 2020.01.08 |
[백준 2578] 빙고 (0) | 2020.01.06 |
[백준 1526] 가장 큰 금민수 (0) | 2020.01.06 |
[백준 2303] 숫자 게임 (0) | 2020.01.03 |