-
[BOJ]백준 7682번: 틱택토(C++)/BackTrackingProblem Solving/BOJ(백준) 2021. 6. 13. 02:27
https://www.acmicpc.net/problem/7682
틱택토 보드판의 상태를 입력받아서 종료 조건으로 가능한 경우인지 판단하는 문제
그냥 백트래킹으로 맨 처음에 모든 틱택토 경우의 수(958가지)를 구해서 map에 저장해주고 입력받은 문자열이 map에 있는지로 판단해주었다
문제푸는걸 쉬었다가 시작해서 그런가?? 요즘 문제 처음볼 때 마다 막막하다 ㅠ.ㅜ
#include <iostream> #include <string> #include <map> #define board(i,j) str[(i)*3+j] using namespace std; map<string, bool> m; string str = "........."; bool ans = false; bool finish() { for (int i = 0; i < 3; i++) { int cnt[2] = { 0,0 }; char c[2] = { board(i, 0), board(0, i) }; for (int j = 0; j < 3; j++) { if (board(i, j) == '.')cnt[0] = 0; else if (board(i, j) == c[0])cnt[0]++; else cnt[0] = 1; if (board(j, i) == '.')cnt[1] = 0; else if (board(j, i) == c[1])cnt[1]++; else cnt[1] = 1; } if (cnt[0] == 3 || cnt[1] == 3) return true; } if (board(0, 0) != '.' && (board(0, 0) == board(1, 1)) && (board(1, 1) == board(2, 2))) return true; if (board(0, 2) != '.' && (board(0, 2) == board(1, 1)) && (board(1, 1) == board(2, 0))) return true; return false; } void func(char turn, int dep) { if (finish() || dep == 9) { m.insert(make_pair(str, true)); return; } for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (board(i, j) == '.') { board(i, j) = turn; if (turn == 'X')func('O', dep + 1); if (turn == 'O')func('X', dep + 1); board(i, j) = '.'; } } int main() { func('X', 0); while (1) { cin >> str; if (str == "end")break; if (m.find(str) != m.end())cout << "valid\n"; else cout << "invalid\n"; } return 0; }
'Problem Solving > BOJ(백준)' 카테고리의 다른 글
[BOJ]백준 21924번: 도시 건설(C++)/MST (0) 2021.06.17 [BOJ]백준 21609번: 상어 중학교(C++)/Simulation (0) 2021.06.14 [BOJ]백준 21776번: 가희와 읽기 쓰기 놀이(Python) (418) 2021.06.13 [BOJ]백준 1043번: 거짓말(C++)/DisjointSet (466) 2021.06.10 [BOJ]백준 21772번: 가희의 고구마 먹방(C++)/BackTracking (798) 2021.06.08