백준[baekjoon]/C언어
백준(baekjoon) [C] - 2589번: 보물섬
_KTH_
2023. 2. 25. 22:22
728x90
https://www.acmicpc.net/problem/2589
2589번: 보물섬
보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서
www.acmicpc.net
#include <stdio.h> // 보물섬
#include <stdlib.h>
#include <string.h>
#define max(a, b) a > b ? a : b
char graph[51][51];
int visit[51][51];
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0, 0 };
int ans = -1;
typedef struct
{
int x;
int y;
struct node* next;
}node;
typedef struct
{
node* rear;
node* front;
int size;
}QUEUE;
void init_QUEUE(QUEUE* q)
{
q->size = 0;
q->rear = q->front = NULL;
}
int is_empty(QUEUE* q)
{
if (q->size <= 0)
return 1;
else
return 0;
}
void push(QUEUE* q, int x, int y)
{
node* newnode = malloc(sizeof(node));
newnode->x = x;
newnode->y = y;
newnode->next = NULL;
if (is_empty(q))
{
q->front = newnode;
}
else
{
q->rear->next = newnode;
}
q->rear = newnode;
(q->size)++;
}
node pop(QUEUE* q)
{
if (is_empty(q))
{
return;
}
else
{
node* temp;
node RETURN;
temp = q->front;
RETURN.x = temp->x;
RETURN.y = temp->y;
q->front = temp->next;
(q->size)--;
free(temp);
return RETURN;
}
}
int bfs(int x, int y, int n, int m)
{
QUEUE q;
init_QUEUE(&q);
push(&q, x, y);
visit[x][y] = 1;
int result = 0;
while (!is_empty(&q))
{
node temp = pop(&q);
if (result < visit[temp.x][temp.y])
{
result = visit[temp.x][temp.y];
}
for (int i = 0; i < 4; i++)
{
int move_x = temp.x + dx[i];
int move_y = temp.y + dy[i];
if (move_x >= 0 && move_y >= 0 && move_x < n && move_y < m)
{
if (graph[move_x][move_y] == 'L' && visit[move_x][move_y] == 0)
{
visit[move_x][move_y] = visit[temp.x][temp.y] + 1;
push(&q, move_x, move_y);
}
}
}
}
return result;
}
void solution(int n, int m)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (graph[i][j] == 'L')
{
memset(visit, 0, sizeof(visit));
int temp = bfs(i, j, n, m);
ans = max(ans, temp);
}
}
}
}
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
scanf(" %c", &graph[i][j]);
}
}
solution(n, m);
printf("%d", ans - 1);
return 0;
}
MEMO
-- 처음에 cnt 변수를 선언하여 조건에 맞을 때 마다 cnt++를 해주는 방식으로 하였다.
-- 하지만 이 방식은 한 점에서 최단거리를 구하는 개념이 아니라 조건에 맞는 인접 배열들을 카운트하는 것이었다.
-- 결국 구글링을 통해서 인접배열의 값을 각각 1씩 더해서 visit에 저장하는 방식으로 문제를 해결하였다.
!! 천천히 생각하기 !!
728x90
728x90