문제 링크
: https://www.acmicpc.net/problem/17837
구현...
문제푸는데 하루종일 걸렸지만 너무 재밌었당~~
import java.util.*;
import java.io.*;
class horse{
int x,y,dist;
horse(int x, int y, int dist){
this.x = x ;
this.y = y;
this.dist = dist ;
}
}
class Main {
static int N,K,count;
static int[][] map ;
static horse[] horse_info;
static ArrayList<Integer>[][] horses ;
public static int stoi(String s){
return Integer.parseInt(s);
}
public static void main(String[] args) throws Exception {
// 값 입력받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = stoi(st.nextToken());
K = stoi(st.nextToken());
map = new int[N][N]; // 체스판 색 정보
horse_info = new horse[K]; // 1~K개의 말 정보
horses = new ArrayList[N][N]; // 말 위치
for(int i=0;i<N;i++){
for(int j=0;j<N;j++) horses[i][j] = new ArrayList<>();
}
for(int i=0;i<N;i++){ // 체스판 색 정보
st = new StringTokenizer(br.readLine());
for(int j=0;j<N;j++){
map[i][j] = stoi(st.nextToken());
}
}
for(int i=0;i<K;i++){ // 말 정보 : 행,열,이동 방향
st = new StringTokenizer(br.readLine());
int x = stoi(st.nextToken())-1;
int y = stoi(st.nextToken())-1;
int dist = stoi(st.nextToken())-1;
horse_info[i] = new horse(x, y, dist); // 말 정보에 해당 말 추가
horses[x][y].add(i); // 말 위치에 해당 말 추가
}
while(true){
if (count >= 1000){
break;
}
count ++ ;
// 말 1번부터 K번까지 이동
MovePiece();
}
System.out.println(-1);
}
static int[] dy = {1,-1,0,0}, dx = {0,0,-1,1}; // → 1 , ← 2 , ↑ 3 , ↓ 4 우좌상하
public static void MovePiece(){
for(int i=0; i<K;i++){ // 현재 말
// 기존 정보
int x = horse_info[i].x;
int y = horse_info[i].y;
int dist = horse_info[i].dist;
// 이동한 좌표
int xx = x + dx[dist];
int yy = y + dy[dist];
// 영역을 벗어나거나 파란색인 경우
if(xx<0 || xx>=N || yy<0 || yy>=N || map[xx][yy] == 2 ){
// 방향을 바꿈
horse_info[i].dist = (dist == 0 | dist == 1)? 1-dist : 5-dist ;
// 방향을 바꾼 뒤의 좌표
xx = x + dx[horse_info[i].dist];
yy = y + dy[horse_info[i].dist];
if(xx<0 || xx>=N || yy<0 || yy>=N || map[xx][yy] == 2) continue;
}
// 흰색이나 빨간색인 경우
boolean check = false ;
ArrayList<Integer> temp = new ArrayList<>();
// 이동할 말 temp에 담기
for(int j=0;j<horses[x][y].size();j++){ // 현재좌표의 말들을 확인
int now = horses[x][y].get(j);
if(now == i) check = true ; // 현재 말 확인, 현재 말부터 좌표이동 시작
if(check){
horse_info[now].x = xx ;
horse_info[now].y = yy ;
temp.add(now);
horses[x][y].remove(j);
j--;
}
}
// 다음 좌표로 이동
if(map[xx][yy]==0){
for(int j=0;j<temp.size();j++){
horses[xx][yy].add(temp.get(j));
}
}else{
for(int j=temp.size()-1;j>=0;j--){
horses[xx][yy].add(temp.get(j));
}
}
// 4개 이상 확인
if(horses[xx][yy].size() >= 4){
System.out.println(count);
System.exit(0);
}
}
}
}