DP없이 완전탐색만으로 우선해보고싶어서 작성한 코드입니다.
런타임 에러 내용은
RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)
입니다. 2차원 배열을 사용한것 외에는 포인터관련 연산을 하지 않았는데 어느부분이 문제가 되서 런타임 에러가 발생하는지 잘 모르겠습니다;
100 x 100 크기의 int형 2차원 배열, 격자의 크기 wide가 전역변수로 선언되어있고 scanf로 각각 내용을 입력받습니다.
#include <utility>
#include <stdio.h>
#include <string>
#include <map>
#include <algorithm>
#include <vector>
using namespace std;
// 현위치로부터 보드에 도달할 수 있는지 없는지를 확인해주는 canReach
bool canReach(int y, int x);
// 현위치가 유효한 보드범위 내 위치인지 확인하는 isRight
bool isRight(int y, int x);
// 격자를 모두 -1로 초기화해준다.
void initiateBoard(void);
// 전역변수
int board[100][100]; // 격자
int wide = 0; // 격자의 크기
int main(void) {
int C = 0; // case의 수
// case 수를 입력받음
scanf("%d", &C);
// case 만큼 수행
while( C-- ) {
// 격자를 초기화
initiateBoard();
// 격자의 크기를 입력받음
scanf("%d", &wide);
// 격자정보를 입력받음
for( int i = 0; i < wide; i++ ) {
for( int j = 0; j < wide; j++ ) {
scanf("%d", &(board[i][j]));
}
}
// 경로존재 여부에따른 결과 출력
if( canReach(0, 0) )
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
bool canReach(int y, int x) {
bool flag = false; // =|연산을 위한 flag
// 기저사례1 - 현재 격자위치가 끝지점( board[y][x] == 0 )에 도달, true반환
if( board[y][x] == 0 )
return true;
// 기저사례2 - 현재 격자위치가 유효하지 않은 board 범위에 도달, (영역초과) -> isRight
else if( !isRight(y, x) )
return false;
else {
// 재귀호출
// 1. 현재위치y,x에서 board[y][x]만큼 오른쪽으로
flag |= canReach(y, x+board[y][x]);
// 2. 현재위치y,x에서 board[y][x]만큼 아래쪽으로
flag |= canReach(y+board[y][x], x);
return flag;
}
}
bool isRight(int y, int x) {
// y, x의 값이 wide 보다 크거나 같으면 잘못된 위치 -> false 반환
if( (y >= wide) || (x >= wide) )
return false;
else
return true;
}
void initiateBoard(void) {
// 격자를 모두 -1로 초기화
for( int i = 0; i < 100; i++) {
for( int j = 0; j < 100; j++ ) {
board[i][j] = -1;
}
}
}
kim08277
DP없이 완전탐색만으로 우선해보고싶어서 작성한 코드입니다.
런타임 에러 내용은
RTE (SIGSEGV: segmentation fault, probably incorrect memory access or stack overflow)
입니다. 2차원 배열을 사용한것 외에는 포인터관련 연산을 하지 않았는데 어느부분이 문제가 되서 런타임 에러가 발생하는지 잘 모르겠습니다;
100 x 100 크기의 int형 2차원 배열, 격자의 크기 wide가 전역변수로 선언되어있고 scanf로 각각 내용을 입력받습니다.
11년 전