쪼금 더 어렵다..
#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;
}