[백준 7682번 C/C++] 틱택토
[백준 7682번 C/C++] 틱택토

https://www.acmicpc.net/problem/7682
7682번: 틱택토
틱택토 게임은 두 명의 사람이 번갈아가며 말을 놓는 게임이다. 게임판은 3×3 격자판이며, 처음에는 비어 있다. 두 사람은 각각 X 또는 O 말을 번갈아가며 놓는데, 반드시 첫 번째 사람이 X를 놓고
www.acmicpc.net
해결전략
구현
정답코드
#include <iostream> #include <vector> using namespace std; vector<string> v; bool isWin(int ny, int nx, char player) // 특정 플레이어가 이겼는지 확인하는 함수 { // 가로 틱택토 if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 1] && v[ny][nx + 1] == v[ny][nx + 2]) return true; if (v[ny][nx + 3] == player && v[ny][nx + 3] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 5]) return true; if (v[ny][nx + 6] == player && v[ny][nx + 6] == v[ny][nx + 7] && v[ny][nx + 7] == v[ny][nx + 8]) return true; // 세로 틱택토 if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 3] && v[ny][nx + 3] == v[ny][nx + 6]) return true; if (v[ny][nx + 1] == player && v[ny][nx + 1] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 7]) return true; if (v[ny][nx + 2] == player && v[ny][nx + 2] == v[ny][nx + 5] && v[ny][nx + 5] == v[ny][nx + 8]) return true; // 대각선 틱택토 if (v[ny][nx] == player && v[ny][nx] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 8]) return true; if (v[ny][nx + 2] == player && v[ny][nx + 2] == v[ny][nx + 4] && v[ny][nx + 4] == v[ny][nx + 6]) return true; return false; } bool TikTakToc(int ny, int nx) // 현재의 게임판 상태가 유효한지 검사하는 함수 { int Xnum = 0, Onum = 0; for (int i = 0; i < 9; i++) { if (v[ny][i] == 'X') Xnum++; else if (v[ny][i] == 'O') Onum++; } // X와 O의 개수가 규칙에 맞지 않는 경우 false 반환 if (Xnum != Onum && Xnum != Onum + 1) return false; // 각 플레이어가 이겼는지 확인 bool Xwin = isWin(ny, nx, 'X'); bool Owin = isWin(ny, nx, 'O'); // 둘 다 이긴 경우 if (Xwin && Owin) return false; // X가 이겼는데 말을 둔 횟수가 같은 경우(O가 하나 더 적어야 한다). if (Xwin && Xnum == Onum) return false; // O가 이겼는데 X의 말이 더 많은 경우(O가 이기는 경우 말의 개수는 같아야 한다). if (Owin && Xnum > Onum) return false; // 승자가 없고 아직 게임판이 다 차지 않은 상태 if (!Xwin && !Owin && Xnum + Onum != 9) return false; return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); string input; while (cin >> input) { if (input == "end") break; v.emplace_back(input); } for (int i = 0; i < v.size(); i++) { if (TikTakToc(i, 0)) cout << "valid" << "\n"; else cout << "invalid" << "\n"; } return 0; }
'⭐ 코딩테스트 > 백준' 카테고리의 다른 글
[백준 14499번 C/C++] 주사위 굴리기 (0) | 2024.05.04 |
---|---|
[백준 1520번 C/C++] 내리막 길 (0) | 2024.04.23 |
[백준 15864번 C/C++] 사다리 조작 (1) | 2024.04.19 |
[백준 6087번 C/C++] 레이저 통신 (0) | 2024.04.16 |
[백준 2589번 C/C++] 보물선 (0) | 2024.04.15 |
댓글
이 글 공유하기
다른 글
-
[백준 14499번 C/C++] 주사위 굴리기
[백준 14499번 C/C++] 주사위 굴리기
2024.05.04 -
[백준 1520번 C/C++] 내리막 길
[백준 1520번 C/C++] 내리막 길
2024.04.23 -
[백준 15864번 C/C++] 사다리 조작
[백준 15864번 C/C++] 사다리 조작
2024.04.19 -
[백준 6087번 C/C++] 레이저 통신
[백준 6087번 C/C++] 레이저 통신
2024.04.16
댓글을 사용할 수 없습니다.