acmicpc

[BAEKJOON] 1525. 퍼즐

코드와이 2021. 5. 13. 23:33

 

문제링크

https://www.acmicpc.net/problem/1525

 

1525번: 퍼즐

세 줄에 걸쳐서 표에 채워져 있는 아홉 개의 수가 주어진다. 한 줄에 세 개의 수가 주어지며, 빈 칸은 0으로 나타낸다.

www.acmicpc.net

 

package acmicpc.Gold2;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;

public class 퍼즐 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int k = 0;
		for(int i = 0 ; i < 9 ; i++) {
			int t = sc.nextInt();
			if(t == 0) t = 9;
			k = 10*k + t;
		}
		
		Queue<Integer> queue = new LinkedList<>();
		Map<Integer, Integer> map = new HashMap<>();
		
		map.put(k, 0);
		queue.offer(k);
		int ans = -1;
		int dr[] = {-1, 1, 0, 0};
		int[] dc = {0, 0, 1, -1};
		while(!queue.isEmpty()) {
			int q = queue.poll();
			
			if(q == 123456789) {
				ans = map.get(q);
				break;
			}
			
			String now = String.valueOf(q);
			int nine = now.indexOf("9");
			int r = nine / 3;
			int c = nine % 3;
			
			for(int d = 0 ; d < 4 ; d++) {
				int nr = r + dr[d];
				int nc = c + dc[d];
				int move = nr*3 + nc;
				if(nr < 0 || nc < 0 || nr >=3 || nc >= 3) continue;
				char tmp = now.charAt(move);
				StringBuilder next = new StringBuilder(now);
				next.setCharAt(move, '9');
				next.setCharAt(nine, tmp);
				int num = Integer.parseInt(next.toString());
				if(!map.containsKey(num)) {
					map.put(num, map.get(q) + 1);
					queue.offer(num);
				}
			}
		}
		System.out.println(ans);
		
		
	}
}