1986 - 체스
2025. 2. 26. 21:22ㆍPS/백준
문제
https://www.acmicpc.net/problem/1986
느낀점
구현 기본 문제, 처음에는 방문 했는지 아닌지로 풀었는데, 그렇게 하면 원래 말이 서있던 위치와 움직일 수 있는 위치가 구별이 안되니까 각 말의 종류로 구분하도록 바꿨음. 그외에는 전부 움직일 수 있도록 작성
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define pii pair<int, int>
void moveQ(int num, vector<pii> &pos, vector<vector<string>> &board)
{
vector<pii> directionQ = {make_pair(-1, -1), make_pair(-1, 1), make_pair(1, -1), make_pair(1, 1),
make_pair(-1, 0), make_pair(1, 0), make_pair(0, -1), make_pair(0, 1)};
for (int i = 0; i < num; i++)
{
int x = pos[i].first;
int y = pos[i].second;
board[x][y] = "QQ";
for (size_t j = 0; j < directionQ.size(); j++)
{
int muliply = 1;
while (true)
{
int nx = x + directionQ[j].first * muliply;
int ny = y + directionQ[j].second * muliply;
if (nx < 0 || nx >= board.size() || ny < 0 || ny >= board[0].size())
{
break;
}
if (board[nx][ny] == "PP" || board[nx][ny] == "KK" || board[nx][ny] == "QQ")
{
break;
}
board[nx][ny] = "Q";
muliply++;
}
}
}
}
void moveK(int num, vector<pii> &pos, vector<vector<string>> &board)
{
vector<pii> directionK = {make_pair(-2, -1), make_pair(-2, 1), make_pair(-1, -2), make_pair(-1, 2),
make_pair(1, -2), make_pair(1, 2), make_pair(2, -1), make_pair(2, 1)};
for (int i = 0; i < num; i++)
{
int x = pos[i].first;
int y = pos[i].second;
board[x][y] = "KK";
for (size_t j = 0; j < directionK.size(); j++)
{
int nx = x + directionK[j].first;
int ny = y + directionK[j].second;
if (nx >= 0 && nx < board.size() && ny >= 0 && ny < board[0].size() && board[nx][ny] == ".")
{
board[nx][ny] = "K";
}
}
}
}
void moveP(int num, vector<pii> &pos, vector<vector<string>> &board)
{
for (int i = 0; i < num; i++)
{
board[pos[i].first][pos[i].second] = "PP";
}
}
int main()
{
int n, m;
cin >> n >> m;
vector<vector<string>> board(n, vector<string>(m, "."));
vector<pair<int, vector<pii>>> unit(3);
int numQ;
for (int i = 0; i < 3; i++)
{
int temp;
cin >> temp;
int x, y;
vector<pii> tempVec;
if (temp > 0)
{
for (int j = 0; j < temp; j++)
{
cin >> x >> y;
tempVec.push_back(make_pair(x - 1, y - 1));
}
}
unit[i] = make_pair(temp, tempVec);
}
for (int i = 2; i >= 0; i--)
{
if (unit[i].first <= 0)
{
continue;
}
if (i == 2)
{
moveP(unit[i].first, unit[i].second, board);
}
else if (i == 1)
{
moveK(unit[i].first, unit[i].second, board);
}
else
{
moveQ(unit[i].first, unit[i].second, board);
}
}
int answer = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (board[i][j] == ".")
{
answer++;
}
}
}
cout << answer << "\n";
return 0;
}
'PS > 백준' 카테고리의 다른 글
2002 - 추월 (0) | 2025.02.28 |
---|---|
1713 - 후보 추천하기 (0) | 2025.02.26 |
1421 - 나무꾼 이다솜 (0) | 2025.02.26 |
1283 - 단축키 지정 (0) | 2025.02.26 |
28066 - 타노스는 요세푸스가 밉다 (0) | 2025.02.25 |