개발자 톡
연습문제 톡
나무 섭지
테스트케이스
- 등록일
- 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번에서 오답이 발생하네요.. 어떤 테스트 케이스가 있을까요
#나무_섭지
#반례