import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Guard {
static int N,M,num;
static int[] dr = {0,1,-1,0};
static int[] dc = {1,0,0,-1};
static int sum = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
num = Integer.parseInt(st.nextToken());
List<int[]> list = new ArrayList<>();
int dir = 0;
int point =0;
for (int i = 0; i <num ; i++) {
st = new StringTokenizer(br.readLine());
dir = Integer.parseInt(st.nextToken());
point = Integer.parseInt(st.nextToken());
list.add(new int[]{dir,point});
}
int[] guard = new int[2];
st = new StringTokenizer(br.readLine());
guard[0] = Integer.parseInt(st.nextToken());
guard[1] = Integer.parseInt(st.nextToken());
for (int i = 0; i < num; i++) {
int[][] map = new int[M+1][N+1];
boolean[][] visited = new boolean[M+1][N+1];
bfs(map,guard[0],guard[1],list.get(i),visited);
}
System.out.println(sum);
}
public static void bfs(int[][] map,int dir, int point,int[] market,boolean[][] visited){
int row = 0;
int col = 0;
if(dir==1){
row = M;
col = point;
}else if(dir==2){
row = 0;
col = point;
}else if(dir==3){
row = M-point;
col = 0;
}else if(dir==4){
row = M-point;
col = N;
}
int mrow = 0;
int mcol = 0;
if(market[0]==1){
mrow = M;
mcol = market[1];
}else if(market[0]==2){
mrow = 0;
mcol = market[1];
}else if(market[0]==3){
mrow = M-market[1];
mcol = 0;
}else if(market[0]==4){
mrow = M-market[1];
mcol = N;
}
Queue<int[]> que = new LinkedList<>();
que.add(new int[]{row,col});
while (!que.isEmpty()){
int[] current = que.poll();
int crow = current[0];
int ccol = current[1];
for (int i = 0; i < 4; i++) {
int nrow = crow + dr[i];
int ncol = ccol + dc[i];
if(nrow<0||ncol<0||nrow>=M+1||ncol>=N+1)
continue;
if(nrow==0||ncol==0||nrow==M||ncol==N){
if(!visited[nrow][ncol]){
visited[nrow][ncol] = true;
map[nrow][ncol] = map[crow][ccol]+1;
if(nrow==mrow&&ncol==mcol){
sum += map[nrow][ncol];
return;
}
que.add(new int[]{nrow,ncol});
}
}
}
}
}
}
이문제는 특이하게 좌표의 정보를 주지 않고, 방향정보와 거리를 입력값으로 준다.
이를 좌표로 바꾼뒤 접근하는방법을 사용했다.
1. 상점들의 방향정보,거리를 list에 저장한다.
2. 최단거리를 구해야하므로 bfs탐색을 사용한다.
3. 매 상점 탐색마다 bfs탐색을 하고, 매번 map과 visted를 초기화해준다.
4. 상점과, 내 위치를 좌표로 변환한다.(내 위치는 매번 같으므로 bfs함수 밖에서 변환하는 방법이 더 좋았겠다.)
5. 범위 지정이 중요한데, map에 테두리 값만 탐색가능하도록 지정한다.
6. 칸마다 맵의 값을 하나씩 늘려가며 탐색하고, 상점의 좌표에 도달하면 함수를 종료한다.
나는 상점과 내 위치를 전부 좌표형태로 변환 시키고 bfs를 시도했는데,
변환 시키지 않으면서 bfs탐색하는 방법도 있었을 것 같다.
하지만, 익숙하지 않았고, 변환했을때 더 직관적인 것 같아서 변환해서 풀었다.