본문 바로가기
코딩테스트 준비/백준 C#

백준 C# - 7562 +) 풀이

by 코딩하는 돼징 2023. 12. 20.
반응형

문제에서 최소부분이 있으면 BFS를 이용해야 한다.

앞서 BFS문제들을 풀어봤을때 큰 틀은 비슷한 것을 알 수 있다. 이 문제에서 크게 다른 점이 있다면 나이트의 움직임이다.

직접 좌표를 찍어보자 그러면 이를 각각의 배열들로 표현하면 아래와 같이 나온다.

static int[] dirX = { 2, 1, -1, -2, -2, -1, 1, 2 };
static int[] dirY = { 1, 2, 2, 1, -1 , -2 , -2, -1 };

BFS 알고리즘

static void BFS(int x , int y, int n)
{
    Queue<Tuple<int, int>> queue = new Queue<Tuple<int, int>>();
    queue.Enqueue(new Tuple<int, int>(x,y));

    while (queue.Count>0)
    {
        Tuple<int, int> now = queue.Dequeue();
        // 만약 도착지에 도착했다면 반복문에서 빠져나온다.
        if(now.Item1 == desX && now.Item2 == desY)
        {
            Console.WriteLine(graph[now.Item1, now.Item2]);
            break;
        }
        for (int i = 0; i < 8 ; i++)
        {
            int newX = now.Item1 + dirX[i];
            int newY = now.Item2 + dirY[i];
         
            if (newX < 0 || newY < 0 || newY >= n || newX >= n) continue;
            if (graph[newX, newY] != 0) continue;

            graph[newX, newY] = graph[now.Item1, now.Item2] + 1;
            queue.Enqueue(new Tuple<int, int>(newX, newY));
    }
}

코드 전문

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

namespace baek2
{
    class Program
    {
        static int[] dirX = { 2, 1, -1, -2, -2, -1, 1,2 };
        static int[] dirY = { 1, 2, 2, 1, -1 , -2 , -2, -1 };
        static int desX, desY;
        static int[,] graph;

        static void BFS(int x , int y, int n)
        {
            Queue<Tuple<int, int>> queue = new Queue<Tuple<int, int>>();
            queue.Enqueue(new Tuple<int, int>(x,y));

            while (queue.Count>0)
            {
                Tuple<int, int> now = queue.Dequeue();
                
                if(now.Item1 == desX && now.Item2 == desY)
                {
                    Console.WriteLine(graph[now.Item1, now.Item2]);
                    break;
                }
                for (int i = 0; i < 8 ; i++)
                {
                    int newX = now.Item1 + dirX[i];
                    int newY = now.Item2 + dirY[i];

                    if (newX < 0 || newY < 0 || newY >= n || newX >= n) continue;
                    if (graph[newX, newY] != 0) continue;

                    graph[newX, newY] = graph[now.Item1, now.Item2] + 1;
                    queue.Enqueue(new Tuple<int, int>(newX, newY));
                }
            }
        }
        public static void Main()
        {
            int input = int.Parse(Console.ReadLine());
            while (input > 0)
            {
                int n = int.Parse(Console.ReadLine());
                int[] start = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                int[] des = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
                graph = new int[311, 311];
                int x = start[0];
                int y = start[1];

                desX = des[0];
                desY = des[1];

                BFS(x, y, n);
                input--;
            }
        }
    }
}

 

 

 

 

 

 

 

반응형

'코딩테스트 준비 > 백준 C#' 카테고리의 다른 글

백준 C# - 2839  (0) 2024.01.19
백준 C# - 15649 +) 풀이  (0) 2023.12.25
백준 C# - 7576 +) 풀이  (0) 2023.12.19
백준 C# - 4963 +) 풀이  (1) 2023.12.18
백준 C# - 2178 +) 풀이  (0) 2023.12.16

댓글