250x250
반응형
Notice
Recent Posts
Recent Comments
Link
N
(SWEA c++)4615. 재미있는 오셀로 게임 본문
728x90
반응형
오셀로 게임을 구현하면 된다.
조건은 둘 수 없는 곳은 두지 않는다는 좋은 조건이 있다.
완전탐색을 해야하는데,
우선 8방향을 검사해야 한다.
돌을 두는 위치를 기준으로 상하좌우, 좌상, 우상, 좌하, 우하 대각을 검사한다.
for문을 돌면서 turn에 따라 흑, 백돌이 결정되기 때문에
현재 위치가 turn에 따른 돌의 색깔과 일치하면
돌을 두는 위치 ~ 일치하는 돌의 위치까지 해당 색으로 바꿔주고 break를 통해 빠져나오도록 한다.
만약 break를 하지 않는다면 계속 바꿔나가기 때문이다.
#include <iostream>
#include <vector>
using namespace std;
char board[9][9];
int N, M;
void check(int x, int y, int turn)
{
char D, C;
if (turn == 1)
{
D = 'B';
C = 'W';
}
else
{
D = 'W';
C = 'B';
}
// 오른쪽 검사
for (int i = y + 1; i <= N; i++)
{
if (board[x][i] == ' ')
break;
if (board[x][i] == D)
{
for (int j = y; j < i; j++)
board[x][j] = D;
break;
}
}
// 왼쪽 검사
for (int i = y - 1; i > 0; i--)
{
if (board[x][i] == ' ')
break;
if (board[x][i] == D)
{
for (int j = y; j > i; j--)
board[x][j] = D;
break;
}
}
// 아래쪽 검사
for (int i = x + 1; i <= N; i++)
{
if (board[i][y] == ' ')
break;
if (board[i][y] == D)
{
for (int j = x; j < i; j++)
board[j][y] = D;
break;
}
}
// 위쪽 검사
for (int i = x - 1; i > 0; i--)
{
if (board[i][y] == ' ')
break;
if (board[i][y] == D)
{
for (int j = x; j > i; j--)
board[j][y] = D;
break;
}
}
// 우상대각 검사
for (int i = x - 1, j = y + 1; i > 0 && j <= N; i--, j++)
{
if (board[i][j] == ' ')
break;
if (board[i][j] == D)
{
for (int k = x, l = y; k > i && l < j; k--, l++)
board[k][l] = D;
break;
}
}
// 좌상대각 검사
for (int i = x - 1, j = y - 1; i > 0 && j > 0; i--, j--)
{
if (board[i][j] == ' ')
break;
if (board[i][j] == D)
{
for (int k = x, l = y; k > i && l > j; k--, l--)
board[k][l] = D;
break;
}
}
// 우하대각 검사
for (int i = x + 1, j = y + 1; i <= N && j <= N; i++, j++)
{
if (board[i][j] == ' ')
break;
if (board[i][j] == D)
{
for (int k = x, l = y; k < i && l < j; k++, l++)
board[k][l] = D;
break;
}
}
// 좌하대각 검사
for (int i = x + 1, j = y - 1; i <= N && j > 0; i++, j--)
{
if (board[i][j] == ' ')
break;
if (board[i][j] == D)
{
for (int k = x, l = y; k < i && l > j; k++, l--)
board[k][l] = D;
break;
}
}
}
void reset()
{
for (int i = 0; i < 9; i++)
for (int j = 0; j < 9; j++)
board[i][j] = ' ';
}
void play()
{
int x, y, turn;
for (int i = 0; i < M; i++)
{
cin >> y >> x >> turn;
check(x, y, turn);
}
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
for (int tc = 1; tc <= t; tc++)
{
int wC = 0, bC = 0;
cin >> N >> M;
reset();
board[N / 2][N / 2] = 'W';
board[N / 2][N / 2 + 1] = 'B';
board[N / 2 + 1][N / 2] = 'B';
board[N / 2 + 1][N / 2 + 1] = 'W';
play();
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= N; j++)
{
if (board[i][j] == 'B')
bC++;
else if (board[i][j] == 'W')
wC++;
}
}
cout << "#" << tc << " " << bC << " " << wC << endl;
}
return 0;
}
728x90
반응형
'SW Expert Academy' 카테고리의 다른 글
(SWEA c++)5515. 2016년 요일 맞추기 (0) | 2020.11.16 |
---|---|
(SWEA c++)5431. 민석이의 과제 체크하기 (0) | 2020.11.16 |
(SWEA c++)5356. 의석이의 세로로 말해요 (0) | 2020.11.13 |
(SWEA c++)5215. 햄버거 다이어트 (0) | 2020.11.13 |
(SWEA c++)5162. 두가지 빵의 딜레마 (0) | 2020.11.13 |