17837번 새로운 게임2

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

코딩테스트

목록 보기
45/76

쪼금 더 어렵다..

#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<tuple<int,int, int>>& where, int x, int y, int xx, int yy, int start) {
	for (int i = start; i < a[x][y].size();i++) {
		auto& p = a[x][y][i];
		a[xx][yy].push_back(p);
		where[p.first] = make_tuple(xx, yy,a[xx][yy].size()-1);
	}
	a[x][y].resize(start);
}
int main() {
	//freopen("in1.txt", "rt", stdin);
	cin >> n >> m;
	vector<tuple<int,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_tuple(x - 1, y - 1,a[x-1][y-1].size()-1);
	}
	for (int ans = 1; ans <= 1000; ans++) {
		for (int k = 0; k < m; k++) {
			int x, y, index;
			tie(x, y,index) = where[k];
			int dir = a[x][y][index].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][index].second = opposite(dir);
				}
			}
			else {
				a[x][y][index].second = opposite(dir);
			}
			dir = a[x][y][index].second;
			xx = x + dx[dir];
			yy = y + dy[dir];
			//복잡하게 생각할 것 없이 dir를 다시 받고 xx,yy다시 받으면됨
			//판 내부라는게 보장되나?
			if (xx >= 0 && xx < n && yy >= 0 && yy < n) {
				if (board[xx][yy] == 0) {
					go(where, x, y, xx, yy,index);
				}
				else if (board[xx][yy] == 1) {
					reverse(a[x][y].begin()+index, a[x][y].end());
					go(where, x, y, xx, yy,index);
				}
				if ((int)a[xx][yy].size() >= 4) {
					cout << ans << '\n';
					return 0;
				}
			}

		}
	}

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

0개의 댓글

관련 채용 정보