17780번 새로운 게임

동도리동·2021년 9월 29일
0

코딩테스트

목록 보기
44/76

구현문제같은 경우, queue보다 vector를 쓰는게 시간측면이나, 흐름을 따라가는데 더 좋은 것 같다..

#include <iostream>
#include <vector>
#include <algorithm>
#include <tuple>

using namespace std;
int board[12][12];
vector<pair<int, int>> a[12][12];
int n, m;
int dx[4] = { 0,0,-1,1 };
int dy[4] = { 1,-1,0,0 };
int opposite(int dir) {
	if (dir == 0) return 1;
	if (dir == 1) return 0;
	if (dir == 2) return 3;
	return 2;
}
void go(vector<pair<int, int>>& where, int x, int y, int xx, int yy) {
	for (auto& p : a[x][y]) {
		a[xx][yy].push_back(p);
		where[p.first] = make_pair(xx, yy);
	}
	a[x][y].clear();
}
int main() {
	cin >> n >> m;
	vector<pair<int, int>> where(m);
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> board[i][j];
		}
	}
	for (int i = 0; i < m; i++) {
		int x, y, dir;
		cin >> x >> y >> dir;
		a[x - 1][y - 1].push_back(make_pair(i, dir - 1));
		where[i] = make_pair(x - 1, y - 1);
	}
	for (int ans = 1; ans <= 1000; ans++) {
		for (int k = 0; k < m;k++) {
			int x, y;
			tie(x, y) = where[k];
			if (a[x][y][0].first==k) {
				int dir = a[x][y][0].second;
				int xx = x + dx[dir];
				int yy = y + dy[dir];
				if (xx<n&&xx>=0&&yy>=0&&yy<n) {
					if (board[xx][yy] == 2) {
						a[x][y][0].second = opposite(dir);
					}
				}
				else {
					a[x][y][0].second = opposite(dir);
				}
				dir = a[x][y][0].second;
				xx = x + dx[dir];
				yy = y + dy[dir];
				//복잡하게 생각할 것 없이 dir를 다시 받고 xx,yy다시 받으면됨
				//판 내부라는게 보장되나? No 한번 더 체크
				if (xx >= 0 && xx < n && yy >= 0 && yy < n) {
					if (board[xx][yy] == 0) {
						go(where, x, y, xx, yy);
					}
					else if (board[xx][yy] == 1) {
						reverse(a[x][y].begin(), a[x][y].end());
						go(where, x, y, xx, yy);
					}
					if ((int)a[xx][yy].size() >= 4) {
						cout << ans << '\n';
						return 0;
					}
				}
				
			}
			else {
			}
		}
	}

	cout << -1 << '\n';
	return 0;
}
profile
긍정코딩세상

0개의 댓글

관련 채용 정보