๋ฌธ์ (์ถ์ฒ: https://www.acmicpc.net/problem/7562)
<๋์ดํธ์ ์ด๋>
๋ฌธ์
์ฒด์คํ ์์ ํ ๋์ดํธ๊ฐ ๋์ฌ์ ธ ์๋ค. ๋์ดํธ๊ฐ ํ ๋ฒ์ ์ด๋ํ ์ ์๋ ์นธ์ ์๋ ๊ทธ๋ฆผ์ ๋์์๋ค. ๋์ดํธ๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ด ์ฃผ์ด์ง๋ค. ๋์ดํธ๋ ๋ช ๋ฒ ์์ง์ด๋ฉด ์ด ์นธ์ผ๋ก ์ด๋ํ ์ ์์๊น?
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ ์ธ ์ค๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. ์ฒซ์งธ ์ค์๋ ์ฒด์คํ์ ํ ๋ณ์ ๊ธธ์ด l(4 ≤ l ≤ 300)์ด ์ฃผ์ด์ง๋ค. ์ฒด์คํ์ ํฌ๊ธฐ๋ l × l์ด๋ค. ์ฒด์คํ์ ๊ฐ ์นธ์ ๋ ์์ ์ {0,..., l-1} × {0,..., l-1}๋ก ๋ํ๋ผ ์ ์๋ค. ๋์งธ ์ค๊ณผ ์ ์งธ ์ค์๋ ๋์ดํธ๊ฐ ํ์ฌ ์๋ ์นธ, ๋์ดํธ๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ๋์ดํธ๊ฐ ์ต์ ๋ช ๋ฒ๋ง์ ์ด๋ํ ์ ์๋์ง ์ถ๋ ฅํ๋ค.
๋ฌธ์ ํ์ด
- my solution (Python)
import sys
from collections import deque
def bfs(l, start, end, depth):
dx=[-2,-2,-1,-1,2,2,1,1] # ํ ๋ฒ์ ์ด๋ํ ์ ์๋ ์นธ
dy=[-1,1,-2,2,-1,1,-2,2]
queue=deque([start])
visited=[[0]*l for i in range(l)] # ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited[start[0]][start[1]]=1
flag=0
while queue:
temp=queue.popleft()
for i in range(8):
x=temp[0]+dx[i]
y=temp[1]+dy[i]
if x>=0 and x<l and y>=0 and y<l: # ์ฒด์คํ ๋ฒ์ ์์ด๋ผ๋ฉด
if visited[x][y]==0:
visited[x][y]=1 # ๋ฐฉ๋ฌธ
depth[x][y]=depth[temp[0]][temp[1]]+1 # ์ด๋ ์
queue.append([x,y])
if x==end[0] and y==end[1]: # ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ ๋์ฐฉ
flag=1
break
if flag==1:
break
if __name__=='__main__':
t=int(input())
for i in range(t):
l=int(sys.stdin.readline().strip())
x,y=map(int, sys.stdin.readline().split()) # ํ์ฌ ์์น
a,b=map(int, sys.stdin.readline().split()) # ์ด๋ ์์น
depth=[[0]*l for j in range(l)]
bfs(l, [x,y], [a,b], depth)
print(depth[a][b])
- my solution (JAVA)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
public class _7562_๋์ดํธ์์ด๋ {
static void bfs(int l, int start[], int end[], int depth[][]) {
int dx[]= {-2,-2,-1,-1,2,2,1,1}; // ์ด๋ํ ์ ์๋ ์นธ
int dy[]= {-1,1,-2,2,-1,1,-2,2};
int visited[][]=new int[l][l]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ
visited[start[0]][start[1]]=1;
Queue<int []> queue=new LinkedList<>();
queue.add(start);
int flag=0;
while(queue.size()!=0) {
int temp[]=queue.poll();
for(int i=0; i<8; i++) {
int x=temp[0]+dx[i];
int y=temp[1]+dy[i];
if(x>=0 && x<l && y>=0 && y<l) { // ์ฒด์คํ ๋ฒ์ ์์ด๋ผ๋ฉด
if(visited[x][y]==0) {
visited[x][y]=1; // ๋ฐฉ๋ฌธ
queue.add(new int[] {x,y});
depth[x][y]=depth[temp[0]][temp[1]]+1;
if(x==end[0] && y==end[1]) { // ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ ๋์ฐฉ
flag=1;
break;
}
}
}
}
if(flag==1) {
break;
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
int t=Integer.parseInt(bf.readLine()); // ํ
์คํธ ์ผ์ด์ค
for(int i=0; i<t; i++) {
int l=Integer.parseInt(bf.readLine()); // ์ฒด์คํ์ ํ ๋ณ์ ๊ธธ์ด
int start[]=new int[2]; // ํ์ฌ ์๋ ์นธ
String s=bf.readLine();
start[0]=Integer.parseInt(s.split(" ")[0]);
start[1]=Integer.parseInt(s.split(" ")[1]);
int end[]=new int[2]; // ๋์ดํธ๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ
s=bf.readLine();
end[0]=Integer.parseInt(s.split(" ")[0]);
end[1]=Integer.parseInt(s.split(" ")[1]);
int depth[][]=new int[l][l];
bfs(l,start,end,depth);
System.out.println(depth[end[0]][end[1]]);
}
}
}
์์ ์์น์์ ํ ๋ฒ์ ์ด๋ํ ์ ์๋ ์นธ๋งํผ ์์ง์ฌ ๋์ดํธ๊ฐ ์ด๋ํ๋ ค๊ณ ํ๋ ์นธ์ ๋์ฐฉํ๋ฉด ์ด๋ํด์ผ ํ๋ ์๋ฅผ ์ถ๋ ฅํด์ค๋ค
- bfs
: dx, dy = ํ ๋ฒ์ ์ด๋ํ ์ ์๋ ์นธ
: flag = break ์กฐ๊ฑด
: queue๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต -> ์ ์ผ ์ฒ์ ๊ฐ์ pop -> ์ด๋ํ ์ ์๋ ์นธ์ธ์ง ํ์ธํ์ฌ ์ฒด์คํ ๋ฒ์ ์์ด๋ฉฐ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด queue์ ์ถ๊ฐ ๋ฐ ๋ฐฉ๋ฌธ check, ์ด๋ํ ์์น์ depth=ํ์ฌ ์์น์ depth+1
: ์ด๋ํ ์์น๊ฐ ์ด๋ํ๋ ค๋ ์์น์ ๊ฐ๋ค๋ฉด ์ข ๋ฃ - main
: t = ํ ์คํธ ์ผ์ด์ค
: l = ์ฒด์คํ์ ํ ๋ณ์ ๊ธธ์ด
: x, y = ํ์ฌ ์์น
: a, b = ์ด๋ํ๋ ค๋ ์์น
: depth = ์ด๋ ํ์ ( result = depth [a][b] )
์๊ฐ๐ค
๋ฌธ์ ์์ ํน๋ณํ ์์ธ๋ ์์๋ค. ๋ฑ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๊ฐ์ง๊ณ ๊ทธ๋ํ ํ์ํ๋ฉด ํด๊ฒฐ -!
์ปดํ์ผ ์๋ฌ๋... java๋ก ์ ์ถํด์ผ ํ๋๋ฐ python์ผ๋ก ์ ์ถํด์ ๋ฐ์...
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 2583_์์ญ ๊ตฌํ๊ธฐ (0) | 2022.04.06 |
---|---|
[Baekjoon] 1697_์จ๋ฐ๊ผญ์ง (0) | 2022.04.05 |
[Baekjoon] 2468_์์ ์์ญ (0) | 2022.04.01 |
[Baekjoon] 2178_๋ฏธ๋ก ํ์ (0) | 2022.03.31 |
[Baekjoon] 6198_์ฅ์ ์ ์ ๊พธ๋ฏธ๊ธฐ (0) | 2022.03.29 |