Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 스택
- XR Interaction Toolkit
- BFS
- 트리
- 백준
- 유니온 파인드
- 알고리즘
- c++
- ue5
- 문자열
- 유니티
- 시뮬레이션
- 수학
- 자료구조
- 정렬
- 다익스트라
- 백트래킹
- 누적 합
- VR
- 그래프
- 다이나믹 프로그래밍
- 그리디 알고리즘
- 구현
- Team Fortress 2
- DFS
- Unreal Engine 5
- 브루트포스
- 투 포인터
- 재귀
- 우선순위 큐
Archives
- Today
- Total
1일1알
백준 8972번 미친 아두이노 C++ 본문
1. 내 아두이노를 방향에 맞게 이동시킨다. 이때, 이동한 곳에 미친 아두이노가 있으면 종료한다.
2. 미친 아두이노를 내 아두이노의 거리가 가장 짧게 되는 지점으로 이동시킨다.
3. 모든 미친 아두이노를 이동시킨 뒤 한 공간에 두 개 이상의 미친 아두이노가 있으면 그 공간에 있는 모든 아두이노를 없앤다.
4. 미친 아두이노가 내 아두이노와 만났다면 종료한다.
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
#include <algorithm>
#include <utility>
#include <stack>
#include <queue>
#include <math.h>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
using namespace std;
using ll = long long;
int r, c;
string moveStr;
int dRow[9] = { 1,1,1,0,0,0,-1,-1,-1 };
int dCol[9] = { -1,0,1,-1,0,1,-1,0,1 };
void PrintBoard(const vector<vector<char>>& board) {
for (auto a : board) {
for (auto b : a) {
cout << b;
}
cout << "\n";
}
cout << "\n";
}
bool MoveMyArd(pair<int, int>& myArd, vector<vector<char>>& board, int dir) {
int nextRow = myArd.first + dRow[dir];
int nextCol = myArd.second + dCol[dir];
if (board[nextRow][nextCol] == 'R') return false;
board[myArd.first][myArd.second] = '.';
myArd.first = nextRow;
myArd.second = nextCol;
board[myArd.first][myArd.second] = 'I';
return true;
}
int GetMinDistDir(const pair<int, int>& target, int row, int col) {
int minDist = 10000;
int ret = -1;
for (int i = 0; i < 9; i++) {
int nextRow = row + dRow[i];
int nextCol = col + dCol[i];
if (nextRow < 0 || nextRow >= r) continue;
if (nextCol < 0 || nextCol >= c) continue;
int dist = abs(target.first - nextRow) + abs(target.second - nextCol);
if (dist < minDist) {
minDist = dist;
ret = i;
}
}
return ret;
}
bool MoveCrazyArd(const pair<int, int>& myArd, vector<vector<char>>& board,
vector<pair<int, int>>& crazy_Ards) {
vector<vector<int>> crazy_Ards_Cnt(r, vector<int>(c, 0));
for (int i = 0; i < crazy_Ards.size(); i++) {
int dir = GetMinDistDir(myArd, crazy_Ards[i].first, crazy_Ards[i].second);
int nextRow = crazy_Ards[i].first + dRow[dir];
int nextCol = crazy_Ards[i].second + dCol[dir];
if (board[nextRow][nextCol] == 'I') return false;
board[crazy_Ards[i].first][crazy_Ards[i].second] = '.';
crazy_Ards[i].first = nextRow;
crazy_Ards[i].second = nextCol;
crazy_Ards_Cnt[crazy_Ards[i].first][crazy_Ards[i].second]++;
}
for (auto it = crazy_Ards.begin(); it != crazy_Ards.end();) {
int row = it->first;
int col = it->second;
if (crazy_Ards_Cnt[row][col] > 1) {
it = crazy_Ards.erase(it);
continue;
}
board[row][col] = 'R';
++it;
}
return true;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> r >> c;
pair<int, int> myArd;
vector<vector<char>> board(r, vector<char>(c));
vector<pair<int, int>> crazy_Ards;
vector<int> moveVec;
for (int i = 0; i < r; i++) {
string str;
cin >> str;
for (int j = 0; j < c; j++) {
board[i][j] = str[j];
if (str[j] == 'I') myArd = { i,j };
if (str[j] == 'R') crazy_Ards.push_back({ i,j });
}
}
cin >> moveStr;
for (int i = 0; i < moveStr.length(); i++) {
int dir = moveStr[i] - '0' - 1;
moveVec.push_back(dir);
}
int cnt = 0;
for (int i = 0; i < moveVec.size(); i++) {
cnt++;
if (!MoveMyArd(myArd, board, moveVec[i])) break;
if (!MoveCrazyArd(myArd, board, crazy_Ards)) break;
}
if (cnt < moveVec.size()) {
cout << "kraj" << " " << cnt;
}
else PrintBoard(board);
};
'알고리즘' 카테고리의 다른 글
백준 3678번 카탄의 개척자 C++ (0) | 2022.02.04 |
---|---|
백준 10253번 헨리 C++ (0) | 2022.02.04 |
백준 10836번 여왕벌 C++ (0) | 2022.02.03 |
백준 17259번 선물이 넘쳐흘러 C++ (0) | 2022.02.02 |
백준 2818번 숙제하기 싫을 때 C++ (0) | 2022.02.01 |