[boj](g 2)1525パズル
BFSͿ最短経路
質問する
隣接する4つのセルのうち1つが空の場合は、そのセル に数値を移動します.
クリーンアップ状態を作成するには、 の移動が必要である.最小移動回数 を求めます
つまり.固定経路のみ、 最低移動速度 は、特定の状態を満たさなければならない.
指定された経路のみで移動して目的地に到達する最短経路の問題であるといえる.
従って、BFSを用いる
一般的な最短経路の問題とは異なり、移動するたびに地図が変わります.
そのため、移動するたびに地図を更新する必要があります.
O(N^2)
これは最も短い経路を探すことに気づきにくい問題である.
移動不可能な状態にあるかどうか、移動するたびに地図の変更が反映されるかどうかを確認する必要があります.
質問する
リンク
に答える
1.質問へのアクセス
1.質問へのアクセス
クリーンアップ状態
2.トラブルシューティングロジック(解法)
つまり.
指定された経路のみで移動して目的地に到達する最短経路の問題であるといえる.
従って、BFSを用いる
注意しなければならないのは
一般的な最短経路の問題とは異なり、移動するたびに地図が変わります.
そのため、移動するたびに地図を更新する必要があります.
ぎじふごう
int ans[3][3] = {{1,2,3},{4,5,6},{7,8,0}} // 정리된 상태 (도착지)
int dist[3][3] // 이동거리
int map[3][3]
queue<pair<int, int>> que
bool success
bool
dx = {0, 1, 0, -1}
dy = {1, 0, -1, 0}
BFS(){
while(!que.empty){
y = que.front.first
x = que.front.second
que.pop
// 정리된 상태인지 확인
success = true
for(i : 0 ~ 3){
for(j : 0 ~ 3){
if(ans[i][j] != map[i][j]){
success = false
}
}
}
if(success == true){
cout << dist[y][x]
return
}
// 이동할 수 없는 상태인지 확인
status = false
for(i : 0 ~ 3){
nx = x + dx[i]
ny = y + dy[i]
if(map[ny][nx] == 0) status = true
}
if(status == false){ // 이동할 수 없는 상태
cout << "-1"
return
}
// 이동
for(i : 0 ~ 3){
nx = x + dx[i]
ny = y + dy[i]
if(map[ny][nx] != 0) continue // 0이 아닌 곳으로는 이동 불가능
if(nx < 0 || ny < 0 || nx >= 3 || ny >= 3) continue // map을 벗어날 경우
if(dist[ny][nx] != 0) continue // 이전에 이동했던 위치로는 이동 불가능
que.push({ny, nx})
dist[ny][nx] = dist[y][x] + 1
// map 최신화
tmp = map[y][x]
map[y][x] = map[ny][nx]
map[ny][nx] = tmp
}
}
}
}
main(){
for(i : 0 ~ 3){
for(j : 0 ~ 3){
cin >> map[i][j]
if(map[i][j] == 1){
que.push({i,j})
}
}
}
BFS()
}
3.時間複雑度分析
O(N^2)
4.問題の重要な部分
これは最も短い経路を探すことに気づきにくい問題である.
移動不可能な状態にあるかどうか、移動するたびに地図の変更が反映されるかどうかを確認する必要があります.
Reference
この問題について([boj](g 2)1525パズル), 我々は、より多くの情報をここで見つけました https://velog.io/@peanut_/boj-g2-1525-퍼즐テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol