본문 바로가기

Algorithm/BOJ

[BOJ] 1525 퍼즐

 

 

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