Notice
Recent Posts
Recent Comments
Link
DY N DY
실력키우기 오목(C++) 본문
1733 : 오목
제한시간: 1000 ms 메모리제한: 32 MB
해결횟수: 625 회 시도횟수: 3635 회
오목은 바둑판에 검은 바둑알과 흰 바둑알을 교대로 놓아서 겨루는 게임이다. 바둑판에는 19개의 가로줄과 19개의 세로줄이 그려져 있는데 가로줄은 위에서부터 아래로 1번, 2번, ... ,19번의 번호가 붙고 세로줄은 왼쪽에서부터 오른쪽으로 1번, 2번, ... 19번의 번호가 붙는다.
위의 그림에서와 같이 같은 색의 바둑알이 연속적으로 다섯 알을 놓이면 그 색이 이기게 된다. 여시서 연속적이란 가로, 세로 또는 대각선 방향 모두를 뜻한다. 즉, 위의 그림은 검은색이 이긴 경우이다. 하지만 여섯 알 이상이 연속적으로 놓인 경우에는 이긴 것이 아니다.
입력으로 바둑판의 어떤 상태가 주어졌을 때, 검은색이 이겼는지, 흰색이 이겼는지 또는 아직 승부가 결정되지 않았는지를 판단하는 프로그램을 작성하시오. 단, 검은색과 흰색이 동시에 이기거나 검은색 또는 흰색이 두 군데 이상에서 동시에 이기는 경우는 입력으로 들어오지 않는다.
[Copy]0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 2 2 2 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | [Copy]1 3 2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | /************************************************************** Problem: 1733 User: a132034 Language: C++ Result: Success Time:0 ms Memory:1096 kb ****************************************************************/ #include <cstdio> #pragma warning (disable:4996) int board[20][20]; struct point { int x, y; }; point pQ[444]; int front = 1; int rear = 1; int main() { for (int i = 1; i <= 19; ++i) for (int j = 1; j <= 19; ++j) { scanf("%d", &board[i][j]); if (board[i][j] != 0) { pQ[rear].x = i; pQ[rear].y = j; rear++; } } while (front < rear) { point tmp; tmp = pQ[front++]; bool flg = true; // 우측 for (int i = 1; i <= 4; ++i) { if (board[tmp.x][tmp.y] != board[tmp.x + i][tmp.y]) flg = false; } if (board[tmp.x][tmp.y] == board[tmp.x + 5][tmp.y] || board[tmp.x][tmp.y] == board[tmp.x - 1][tmp.y]) flg = false; if (flg) { printf("%d\n%d %d\n", board[tmp.x][tmp.y], tmp.x, tmp.y); return 0; } // 대각선 아래 flg = true; for (int i = 1; i <= 4; ++i) { if (board[tmp.x][tmp.y] != board[tmp.x + i][tmp.y + i]) flg = false; } if (board[tmp.x][tmp.y] == board[tmp.x + 5][tmp.y + 5] || board[tmp.x][tmp.y] == board[tmp.x - 1][tmp.y - 1]) flg = false; if (flg) { printf("%d\n%d %d\n", board[tmp.x][tmp.y], tmp.x, tmp.y); return 0; } // 대각선 위 if (tmp.y - 4 > 0) { flg = true; for (int i = 1; i <= 4; ++i) { if (board[tmp.x][tmp.y] != board[tmp.x - i][tmp.y + i]) flg = false; } if (board[tmp.x][tmp.y] == board[tmp.x - 5][tmp.y + 5] || board[tmp.x][tmp.y] == board[tmp.x + 1][tmp.y - 1]) flg = false; if (flg) { printf("%d\n%d %d\n", board[tmp.x][tmp.y], tmp.x, tmp.y); return 0; } } // 아래 flg = true; for (int i = 1; i <= 4; ++i) { if (board[tmp.x][tmp.y] != board[tmp.x][tmp.y + i]) flg = false; } if (board[tmp.x][tmp.y] == board[tmp.x][tmp.y + 5] || board[tmp.x][tmp.y] == board[tmp.x][tmp.y - 1]) flg = false; if (flg) { printf("%d\n%d %d\n", board[tmp.x][tmp.y], tmp.x, tmp.y); return 0; } } printf("0\n"); return 0; } | cs |
오목 그대로 구현했다.
가장 왼쪽 또는 세로로 5개 인 경우 가장 위쪽을 출력해야 하므로
점을 기준으로 위 오른쪽 대각선, 오른쪽, 아래 오른쪽 대각선, 세로 이렇게 차례로 확인하였고 승리조건인 5개를 만족하면 확인 시작한 위치를 출력하였다.
5개 이상이면 안되므로 시작점 이전 또는 완료후 6번째가 1~5번째와 동일한 색상의 돌이 아닐 경우에만 맞는 것으로 하였다.
'PARK > ALGORITHM' 카테고리의 다른 글
BOJ 3020 개똥벌레(C++) (0) | 2016.09.19 |
---|---|
실력키우기 색종이(중)(C++) (0) | 2016.09.19 |
실력키우기 주사위 쌓기(C++) (0) | 2016.09.19 |
BOJ 1963 소수 경로(C++) (0) | 2016.09.09 |
알고리즘 & BOJ 2302 극장좌석(C++) (0) | 2016.09.08 |