#include <cstdio>
#include <vector>
#include <queue>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <set>
#include <deque>
#include <numeric>
#include <map>
#define ll long long
using namespace std;
int N,K,ans;
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, -1, 1};
int board[15][15];
deque<int> horse[15][15];
vector<pair<pair<int,int>,int>> v;
int reverseDir(int d){
if(d == 0) return 1;
if(d == 1) return 0;
if(d == 2) return 3;
return 2;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> N >> K;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
cin >> board[i][j];
for(int i=1;i<=K;i++)
{
int r,c,d;
cin >> r >> c >> d;
horse[r][c].push_back(i);
v.push_back({{r,c},d-1});
}
while(true)
{
ans++;
for(int i=0;i<v.size();i++)
{
if(horse[v[i].first.first][v[i].first.second].size()>=4) goto stop;
int dir = v[i].second;
int ny = v[i].first.first + dy[dir];
int nx = v[i].first.second + dx[dir];
if(nx<1 or ny<1 or nx>N or ny>N){
dir = reverseDir(dir);
v[i].second = dir;
i--;
continue;
}
auto tmp = horse[v[i].first.first][v[i].first.second];
vector<int> ttmp;
for(int a=tmp.size()-1;a>=0;a--)
{
ttmp.push_back(tmp[a]);
horse[v[i].first.first][v[i].first.second].pop_back();
if(tmp[a] == i+1) break;
}
if(board[ny][nx] == 0){
for(int a=ttmp.size()-1;a>=0;a--)
{
horse[ny][nx].push_back(ttmp[a]);
v[ttmp[a]-1].first = {ny,nx};
}
}else if(board[ny][nx] == 1){
for(int a=0;a<ttmp.size();a++)
{
horse[ny][nx].push_back(ttmp[a]);
v[ttmp[a]-1].first = {ny,nx};
}
}else if(board[ny][nx] == 2){
dir = reverseDir(dir);
v[i].second = dir;
int nny = v[i].first.first + dy[dir];
int nnx = v[i].first.second + dx[dir];
for(int a=ttmp.size()-1;a>=0;a--)
horse[v[i].first.first][v[i].first.second].push_back(ttmp[a]);
if((nny<1 or nnx<1 or nnx>N or nny>N) or (board[nny][nnx] == 2)){
continue;
}
i--;
continue;
}
if(horse[ny][nx].size()>=4) goto stop;
}
if(ans > 1000){
ans = -1;
goto stop;
}
}
stop:;
cout << ans;
return 0;
}
- 핵심
-
다음 이동하는 칸
이 blue
인 경우 새로운 방향
에 대한 새로운 좌표(nny, nnx)
에 대해 다시 한 번 다음 칸을 검사
하고 white / red
이면 다시 해당 말에 대해 검사
하게 i--
를 수행
해야 한다
- 각
반복문
이 시작
하고 끝날 때
horse.size() >=4
인것을 검사
해야 한다