일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
Tags
- 네트워크
- 프로그래머스
- 감상문
- algogritim
- 데이터베이스
- 알고리즘
- D3
- OS
- 운영체제
- D2
- cs
- Programmers
- network
- BOJ
- 법의학
- data structure
- 독서
- 재테크/투자
- language
- c++
- db
- Computer Science
- SW Expert Academy
- Database
- algorithm
- 문제풀이
- LeetCode
- swea
- 백준
- 자료구조
Archives
- Today
- Total
선택은 나의 것
[BOJ 백준] 17780번 새로운 게임 본문
문제
BOJ 17780 : https://www.acmicpc.net/problem/17780
17780번: 새로운 게임
재현이는 주변을 살펴보던 중 체스판과 말을 이용해서 새로운 게임을 만들기로 했다. 새로운 게임은 크기가 N×N인 체스판에서 진행되고, 사용하는 말의 개수는 K개이다. 말은 원판모양이고, 하
www.acmicpc.net
접근
문제에 주어진 규칙에 따라 체스판 위의 말을 움직여 게임이 몇 턴 만에 종료되는지 알아내는 문제이다. 이런 문제를 시뮬레이션이라고 한다. 난이도가 높은 시뮬레이션 문제일수록 요구하는 조건이 까다롭기 때문에 처음 코드를 구상하는 과정에서부터 꼼꼼하게 조건을 살펴보는 것이 중요하다.
코드
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, k, a, b, c, counter = 0, map[15][15] = {0}, dx[] = {0, 0, 0, -1, 1}, dy[] = {0, 1, -1, 0, 0};
pair<int, int> p[15];
vector<pair<int, int>> num[15][15];
cin >> n >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++)
cin >> map[i][j];
}
for (int i = 0; i < k; i++) {
cin >> a >> b >> c;
p[i + 1] = {a, b};
num[a][b].push_back({i + 1, c});
}
while (1) {
if (counter > 1000) {
cout << -1;
return 0;
}
counter++;
for (int i = 1; i <= k; i++) {
pair<int, int> fl = p[i];
if (num[fl.first][fl.second][0].first != i)
continue;
int newx = fl.first + dx[num[fl.first][fl.second][0].second];
int newy = fl.second + dy[num[fl.first][fl.second][0].second];
int size_num = num[fl.first][fl.second].size();
if (newx <= 0 || newx > n || newy <= 0 || newy > n || map[newx][newy] == 2) { // 파란색
if (num[fl.first][fl.second][0].second == 1)
num[fl.first][fl.second][0].second = 2;
else if (num[fl.first][fl.second][0].second == 2)
num[fl.first][fl.second][0].second = 1;
else if (num[fl.first][fl.second][0].second == 3)
num[fl.first][fl.second][0].second = 4;
else
num[fl.first][fl.second][0].second = 3;
newx = fl.first + dx[num[fl.first][fl.second][0].second];
newy = fl.second + dy[num[fl.first][fl.second][0].second];
if (newx <= 0 || newx > n || newy <= 0 || newy > n || map[newx][newy] == 2)
continue;
}
if (map[newx][newy] == 0) { // 흰색
for (int j = 0; j < size_num; j++) {
p[num[fl.first][fl.second][j].first].first = newx;
p[num[fl.first][fl.second][j].first].second = newy;
num[newx][newy].push_back(num[fl.first][fl.second][j]);
}
for (int j = 0; j < size_num; j++)
num[fl.first][fl.second].pop_back();
} else if (map[newx][newy] == 1) { // 빨간색
for (int j = 0; j < size_num; j++) {
p[num[fl.first][fl.second].back().first].first = newx;
p[num[fl.first][fl.second].back().first].second = newy;
num[newx][newy].push_back(num[fl.first][fl.second].back());
num[fl.first][fl.second].pop_back();
}
}
if (num[newx][newy].size() >= 4) {
cout << counter;
return 0;
}
}
}
}
'☽ Algorithm > BOJ' 카테고리의 다른 글
[BOJ 백준] 14466번 소가 길을 건너간 이유 6 (0) | 2021.12.11 |
---|---|
[BOJ 백준] 16967번 배열 복원하기 (0) | 2021.12.09 |
[BOJ 백준] 15591번 MooTube (Silver) (0) | 2021.12.07 |
[BOJ 백준] 1874번 스택 수열 (0) | 2021.12.06 |
[BOJ 백준] 3865번 학회원 (0) | 2021.11.26 |
Comments