티스토리 뷰
[BOJ 1987(G4) 리뷰]
후... 엄청나게 힘들었던 문제다.
처음엔 문제 잘못읽고 BFS로 접근했다. 코딩 다했는데 그제서야 문제 제대로 이해하고 싹 갈아엎었다.
처음엔 set을 통해 문자를 하나하나씩 쌓으면서 중복된게 있는지 비교했는데, 처음에 백트래킹하면서 쌓아놓았던 문자를 제거하지 않아서 틀렸다. 이걸 수정하고 제출했더니 set때문인지 시간초과가 나왔다.
그래서 인터넷을 참고해 중복된걸 확인하는것을 A~Z까지 배열에 담아 O(1)로 확인했더니 통과되었다.
후.. 2시간은 넘게 걸린거같다.
#include <iostream>
#include <queue>
#include <math.h>
#include <set>
using namespace std;
char board[21][21];
bool isUsed[21][21];
int dx[4] = { 1,-1,0,0 };
int dy[4] = { 0,0,1,-1 };
int maxcnt = 0;
bool visit[27];
int n, m;
string s;
void func(int cur, int r, int c) //r,c 는 좌효 cur은 현재까지 지나온 칸의 개수
{
if (visit[board[r][c]-'A']) return; //해당문자가 set내에 존재하면 return
visit[board[r][c] - 'A'] = 1;
maxcnt = max(maxcnt, cur);
for (int dir = 0; dir < 4; dir++)
{
int nx = r + dx[dir];
int ny = c + dy[dir];
if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
if (isUsed[nx][ny]) continue;
isUsed[nx][ny] = 1;
func(cur + 1, nx, ny);
isUsed[nx][ny] = 0;
}
visit[board[r][c] - 'A'] = 0;
}
int main(void)
{
cin.tie(0);
ios::sync_with_stdio(0);
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
cin >> board[i][j];
}
isUsed[0][0] = 1; //1방문처리하고 1부터 탐색
func(1, 0, 0);
cout << maxcnt;
}
'알고리즘 풀이 > 백트래킹' 카테고리의 다른 글
BOJ : 1062 가르침 (0) | 2021.01.11 |
---|---|
BOJ : 2529 부등호 (0) | 2020.08.23 |
BOJ : 14502 연구소 (0) | 2020.08.21 |
BOJ : 15683 감시 (0) | 2020.08.18 |
BOJ : 15686 치킨 배달 (0) | 2020.08.18 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- java
- node.js
- 재귀
- 예외처리
- nodeJS
- 자바스크립트
- 컴퓨터 통신
- 세그먼트 트리
- 백준
- 백트래킹
- dfs
- 그리디
- 투포인터
- nestjs
- 그래프
- 스레드
- 알고리즘
- BFS
- 컴퓨터 구조
- 시뮬레이션
- 구현
- 중앙대학교
- nest.js
- typeORM
- Computer Architecture
- ReactNative
- 자바
- boj
- 벨만포드
- 동적계획법
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
글 보관함