개발자 톡

연습문제 톡 나무 섭지

테스트케이스

등록일
2024-02-01 21:17:12
조회수
523
작성자
simha12
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define STACK_SIZE 10000000
int bfs(char*** arr, int n, int m);

char stack[STACK_SIZE][3] = {0,};
char goal[2] = {0,};
char temp[STACK_SIZE][2] = {0,};
int main(void)
{
    char ***grid;
    int n,m;
    scanf("%d %d",&n, &m);
    grid = (char***)malloc(sizeof(char**)*n);
    for(int i=0; i<n; i++) 
    {
        grid[i] = (char**)malloc(sizeof(char*)*m); 
        for(int j=0; j<m; j++) 
        {
            grid[i][j] = (char*)malloc(sizeof(char)*2);
        }
    }
    //
    int t=0;
    for(int i=0; i<n; i++) 
    {
        for(int j=0; j<m; j++) 
        {
            scanf("%1s",grid[i][j]);
            if(grid[i][j][0] == 'N') { stack[0][0] = i; stack[0][1] = j; grid[i][j][1] = '1'; continue; }
            if(grid[i][j][0] == 'D') { goal[0]=i; goal[1]=j; }
            if(grid[i][j][0] == 'G') { temp[t][0]=i; temp[t][1]=j; t++; }
            grid[i][j][1] = '0';
        }
    }
    int ret = bfs(grid, n, m);
    
    
    for(int i=0; i<n; i++) 
    {
        for(int j=0; j<m; j++) 
        {
            free(grid[i][j]);
        }
        free(grid[i]);
    }
    free(grid);
    
    if(ret == 0) {printf("No"); return 0;}
    for (int i=0; i<t; i++)
    {
        int distance = abs(temp[i][0]-goal[0]) + abs(temp[i][1]-goal[1]);
        if (distance < ret) {printf("No"); return 0;}
    }
    printf("Yes");
    return 0;
}

int bfs(char*** arr, int n, int m)
{
    int st = 0, tp = 0;
    int x_axis[4] = {-1, 1, 0, 0};
    int y_axis[4] = {0, 0, -1, 1};
    int next_i, next_j;
    int a,b,cnt=1;
    int num=0;
    while(st <= tp)
    {
        a = stack[st][0]; b = stack[st][1];
        st+=1;
        for(int i=0; i<4; i++)
        {
            next_i = a + x_axis[i]; next_j = b + y_axis[i];        
            // 이상치
            if((next_i < 0)||(next_i >= n)||(next_j < 0)||(next_j >= m)) { continue; }
            // 도착
            if(arr[next_i][next_j][0] == 'D') { return stack[st-1][2]+1; }
            // 맵이 갈 수 있는 곳인지
            if((arr[next_i][next_j][0]!='.')||(arr[next_i][next_j][1]=='1')) { continue; }
            // 갈 수 있는 곳
            tp+=1; stack[tp][2]=stack[st-1][2]+1;
            stack[tp][0] = next_i; stack[tp][1] = next_j;
            arr[next_i][next_j][1] = '1';
        }
    }
    return num;
}


N -> D의 최소거리와 G -> D의 최소거리를 구하여 N->D의 최소거리가 짧으면 Yes를 출력하는 알고리즘을 작성했는데 5,6,10번에서 오답이 발생하네요.. 어떤 테스트 케이스가 있을까요

#나무_섭지
#반례

이 카테고리의 톡 더보기