1525번: 퍼즐
세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다.
www.acmicpc.net
#include <iostream>
#include <map>
#include <queue>
#define TARGET "123456780"
using namespace std;
string Input;
map<string, bool> visit;
queue<pair<string, int>> q;
int d[4] = { -3, -1, 1, 3 };
void input(){
int i =0 ;
string N;
while( i++ < 9){
cin >> N;
Input += N;
}
}
bool possible(int cur, int d){
if( (cur % 3) == 0 && d == -1)
return false;
if( (cur % 3) == 2 && d == 1)
return false;
return ( cur + d < 0 || cur + d > 8 ) ? false : true;
}
int bfs(){
visit[Input] = true;
q.push({Input,0});
while(!q.empty()){
string cur = q.front().first;
int cnt = q.front().second;
q.pop();
if(cur.compare(TARGET) == 0)
return cnt;
int cur_blank = cur.find('0');
for(int i =0 ; i < 4; i++){
if(possible(cur_blank, d[i])){
string cur_next = cur;
cur_next[cur_blank] = cur[ cur_blank+d[i] ];
cur_next[ cur_blank+d[i] ] = '0';
if(!visit[cur_next]){
q.push({cur_next, cnt + 1});
visit[cur_next] = true;
}
}
}
}
return -1;
}
int main() {
input();
cout << bfs() <<endl;
return 0;
}
1차원으로 생각하고 문제를 풀었는데 그렇게 하면 배열에서 벗어나는 곳을 찾지 못하는 경우가 생겼다. 2차원 배열은 2차원으로 생각하는게 예외 상황을 안만들어낼 것 같다.
백준 1525번 퍼즐
문제 링크입니다: https://www.acmicpc.net/problem/1525 재미있는 브루트 포스(Brute Force) + BFS(Breadth First Search) 문제였습니다. 핵심은 비어있는 칸 0을 9로 바꿔주는 것이였습니다! 알고리즘은 아래와..
jaimemin.tistory.com
글 읽기 - 반례는 찾았는데 왜 잘못된 결과가 나왔는지 이해하지 못하겠습니다.
댓글을 작성하려면 로그인해야 합니다.
www.acmicpc.net
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ] 2580 스도쿠 (0) | 2021.04.08 |
---|---|
[BOJ] 3108 로고 (0) | 2021.04.07 |
[BOJ] 2261 가장 가까운 두 점 (0) | 2021.03.24 |
[BOJ] 9466 텀 프로젝트 (0) | 2021.03.03 |
[BOJ] 2331 반복수열 (0) | 2021.03.01 |