[백준 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;
}