본문 바로가기
알고리즘/백준 BOJ

[ BOJ/C# ] 16928 뱀과 사다리 게임

by 왹져박사 2023. 10. 24.

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

 

16928번: 뱀과 사다리 게임

첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

www.acmicpc.net

또 BFS 문제이다. 

이번에는 뱀과 사다리라는 조건이 주어진 문제이다. 

이 문제는 map을 x, y를 나누지 않고 100칸을 기준으로 한 배열로 보는 것이 편할 것이라 생각하였다. 

그리고 사다리와 뱀을 따로 나누어 저장했는데, 푼 이후로 다른 분 코드를 찾아보니 나누지 않고 한 배열 안에 저장하더라!!

생각해 보니 굳이 나눌 필요가 없다고 생각되었다. 

using System;
using System.IO;
using System.Text;

namespace B16928
{
    class Program
    {
        static int N, M;
        static int[] map = new int[101];
        static bool[] visited = new bool[101];
        static (int, int)[] ladders = new (int, int)[15];
        static (int, int)[] snakes = new (int, int)[15];
        static Queue<(int, int)> q = new Queue<(int, int)>();
        static int Min = 0;
        static void BFS()
        {
            q.Enqueue((1, 0));
            visited[1] = true;
            while (q.Count > 0)
            {
                var deq = q.Dequeue();
                int deqx = deq.Item1;
                int count = deq.Item2;
                //사다리 뱀 검사
                for(int i = 0; i < 15; i++)
                {
                    if (ladders[i].Item1 == deqx)
                    {
                        //사다리가 있다면 이동
                        deqx = ladders[i].Item2;
                        break;
                    }
                    if (snakes[i].Item1 == deqx)
                    {
                        //뱀이 있다면 이동
                        deqx = snakes[i].Item2;
                        break;
                    }
                }

                //주사위 6칸의 경우의 수 이동
                for(int i = 1; i <= 6; i++)
                {
                    if (deqx + i == 100)
                    {
                        //100번 칸 도착
                        if (Min == 0) Min = count + 1;  //저장된 Min 값이 없다면 새로 저장
                        else if (Min > count) Min = count + 1;  //저장된 Min 값이 있다면 크기 비교
                        continue;
                    }
                    //100을 초과하거나 방문했다면 continue
                    if (deqx + i > 100 || visited[deqx + i]) continue;
                    q.Enqueue((deqx + i, count + 1));
                    visited[deqx + i] = true;
                }
            }
        }
        static void Main()
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            //입력
            int[] nm = Array.ConvertAll(sr.ReadLine().Split(' '), int.Parse);
            N = nm[0];
            M = nm[1];
            //사다리
            for(int i = 0; i < N; i++)
            {
                int[] xy = Array.ConvertAll(sr.ReadLine().Split(' '), int.Parse);
                ladders[i].Item1 = xy[0];
                ladders[i].Item2 = xy[1];
            }
            //뱀
            for(int i = 0; i < M; i++)
            {
                int[] uv = Array.ConvertAll(sr.ReadLine().Split(' '), int.Parse);
                snakes[i].Item1 = uv[0];
                snakes[i].Item2 = uv[1];
            }
            BFS();
            sw.Write(Min);
            sr.Close();
            sw.Flush();
            sw.Close();
        }
    }
}

'알고리즘 > 백준 BOJ' 카테고리의 다른 글

[ BOJ/C# ] 2108 통계학  (0) 2023.10.27
[ BOJ/C# ] 18110 solved.ac  (0) 2023.10.25
[ BOJ/C# ] 1697 숨바꼭질  (0) 2023.10.24
[ BOJ/C# ] 1654 랜선 자르기  (0) 2023.10.23
[ BOJ/C# ] 1436 영화감독 숌  (0) 2023.10.22