검사하고자 하는 돌을 기준으로 총 8방향으로 5목을 만들 수 있다!!
그러나 잘 생각해보면 아래와 같이 쌍으로 묶인 방향은 둘 중 한 방향만 체크해주면 된다. 오목판의 모든 좌표를 8방향으로 검사하게 되면 결국 쌍으로 묶인 방향은 중복으로 체크될 꺼니까!
그래서 나는 오른쪽 위 구석부터 우상, 우, 우하, 하 이렇게 4방향에 대해 오목을 체크해주었고!!!!
오목이면 양 끝을 더 체크해주어 육 목 이상인지 체크해주었다.
코드는 좀 긴데...방향별로 조금 씩만 다른거라 보기는 쉬울겁니다!!!
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 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | #include <stdio.h> int map[19][19]; int CheckRange(int a, int b) { if (a < 0 || b < 0 || a >= 19 || b >= 19) return 0; return 1; } int RightUp(int y, int x, int Color) { int count = 0; for (int i = 0; i < 5; i++) { int yy = y - i; int xx = x + i; if (!CheckRange(yy, xx)) return 0; if (map[yy][xx] == Color) { count++; } } if (count != 5) return 0; //대각선의 양 끝 체크 if (CheckRange(y + 1, x - 1) && map[y + 1][x - 1] == Color) { return 0; } if (CheckRange(y - 5, x + 5) && map[y - 5][x + 5] == Color) { return 0; } return 1; } int Right(int y, int x, int Color) { int count = 0; for (int i = 0; i < 5; i++) { int xx = x + i; if (!CheckRange(y, xx)) return 0; if (map[y][xx] == Color) { count++; } } if (count != 5) return 0; //대각선의 양 끝 체크 if (CheckRange(y, x - 1) && map[y][x - 1] == Color) { return 0; } if (CheckRange(y, x + 5) && map[y][x + 5] == Color) { return 0; } return 1; } int RightDown(int y, int x, int Color) { int count = 0; for (int i = 0; i < 5; i++) { int yy = y + i; int xx = x + i; if (!CheckRange(yy, xx)) return 0; if (map[yy][xx] == Color) { count++; } } if (count != 5) return 0; //대각선의 양 끝 체크 if (CheckRange(y - 1, x - 1) && map[y - 1][x - 1] == Color) { return 0; } if (CheckRange(y + 5, x + 5) && map[y + 5][x + 5] == Color) { return 0; } return 1; } int Down(int y, int x, int Color) { int count = 0; for (int i = 0; i < 5; i++) { int yy = y + i; if (!CheckRange(yy, x)) return 0; if (map[yy][x] == Color) { count++; } } if (count != 5) return 0; //대각선의 양 끝 체크 if (CheckRange(y - 1, x) && map[y - 1][x] == Color) { return 0; } if (CheckRange(y + 5, x) && map[y + 5][x] == Color) { return 0; } return 1; } int main() { for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { scanf("%d", &map[i][j]); } } for (int i = 0; i < 19; i++) { for (int j = 0; j < 19; j++) { if (map[i][j] == 0) continue; if (RightUp(i, j, map[i][j])) { printf("%d\n",map[i][j]); printf("%d %d\n", i + 1, j + 1); return 0; } if (Right(i, j, map[i][j])) { printf("%d\n", map[i][j]); printf("%d %d\n", i + 1, j + 1); return 0; } if (RightDown(i, j, map[i][j])) { printf("%d\n", map[i][j]); printf("%d %d\n", i + 1, j + 1); return 0; } if (Down(i, j, map[i][j])) { printf("%d\n", map[i][j]); printf("%d %d\n", i + 1, j + 1); return 0; } } } printf("0\n"); return 0; } | cs |
'SW 업무 관련 > 백준' 카테고리의 다른 글
[C언어]14503. 로봇 청소기 (0) | 2018.09.16 |
---|---|
[C언어]2573. 빙산 (0) | 2018.09.16 |
[C언어] 7562. 나이트의 이동 (0) | 2018.08.14 |
[C언어] 2206. 벽 부수고 이동하기 (0) | 2018.08.12 |
[C언어] 2667. 단지 번호붙이기 (0) | 2018.08.12 |