문제 풀이/C#

[16928] - 뱀과 사다리 게임

Chamber 2022. 10. 5. 00:58

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

접근 방식

처음에 10*10 이라 2차원 배열로 생각하고 풀었다가 1~100까지 그냥 1차원 배열로 받아도 된다는 것을 깨닫고 사다리와 뱀이 있는 곳에는 그 이동할 위치를 저장해 주었다.

 

풀이 방법

- 1에서 시작하니 큐에 1삽입, 방문 표시 해주고 주사위의 눈이 1~6까지 있으니 반복문 돌리기

- 뱀이나 사다리가 있으면 그 위치로 이동, 아닐시 그 자리 그대로

- 이동 후, 또는 현재 값에 굴린 위치에 +1을 해주면 몇번 굴려서 여기까지 왔는지 알 수 있음

- 100번째에 도달하기 위한 굴린 회수가 있으니 출력.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Baekjoon.Gold
{
    class _16928
    {
        static void Main_16928(string[] args)
        {
            int[] n = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
            int[] board = new int[101];
            bool[] visit = new bool[101];

            //보드에 사다리/뱀 정보 저장
            for(int i = 0; i < n[0] + n[1]; i++)
            {
                int[] m = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                board[m[0]] = m[1];
            }

            //bfs
            Queue<int> que = new Queue<int>();
            visit[1] = true;
            que.Enqueue(1);
            while(que.Count > 0)
            {
                //현재 위치
                int now = que.Dequeue();

                for(int i = 1; i<=6; i++)
                {
                    //주사위를 굴렸을 때 위치가 100넘으면 끊기
                    if (now + i > 100)
                        break;

                    int dice;
                    //만약 뱀이나 사다리 없으면 현재 위치
                    if (board[now + i] == 0)
                        dice = now + i;
                    //뱀이나 사다리 있으면 그걸로 가기
                    else
                        dice = board[now + i];

                    //방문 안했으면
                    if (!visit[dice])
                    {   
                        visit[dice] = true;
                        //현재 몇번짼지 = 굴린위치 +1
                        board[dice] = board[now]+1;
                        //굴릴 위치 넣어주기.
                        que.Enqueue(dice);
                    }
                }
            }

            //Console.WriteLine(string.Join(" ", board));
            Console.WriteLine(board[100]);
        }
    }
}