※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2210번 문제인 숫자판 점프이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2210
2210번: 숫자판 점프
111111, 111112, 111121, 111211, 111212, 112111, 112121, 121111, 121112, 121211, 121212, 211111, 211121, 212111, 212121 이 가능한 경우들이다.
www.acmicpc.net
각 칸을 시작지점으로 하여 점프를 5번 하는 모든 움직이는 경우를 탐색하자.
시작점이 25곳, 점프 5번을 하는 방법은 4^5 = 1024가지이므로 제한시간 내로 탐색을 충분히 마칠 수 있다.
위의 탐색을 구현할 때 숫자판을 벗어나는 점프를 하지 않아야한다는 점에 유의하자.
set을 이용하면 서로 다른 문자열의 개수를 쉽게 구할 수 있다.
아래는 제출한 소스코드이다.
#include <iostream>
#include <set>
#include <string>
using namespace std;
char board[5][5];
set<string> st;
string str = "";
int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };
void func(int r, int c, int len) {
if (len == 6) st.insert(str);
else {
for (int i = 0; i < 4; i++) {
int rr = r + dr[i], cc = c + dc[i];
if (rr == -1 || rr == 5 || cc == -1 || cc == 5) continue;
str.push_back(board[rr][cc]);
func(rr, cc, len + 1);
str.pop_back();
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
for (int r = 0; r < 5; r++) {
for (int c = 0; c < 5; c++) {
cin >> board[r][c];
}
}
for (int r = 0; r < 5; r++) {
for (int c = 0; c < 5; c++) {
str.push_back(board[r][c]);
func(r, c, 1);
str.pop_back();
}
}
cout << st.size();
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 13900 // C++] 순서쌍의 곱의 합 (0) | 2022.03.20 |
---|---|
[BOJ 23973 // C++] 표적지 옮기기 (0) | 2022.03.19 |
[BOJ 24420 // C++] ピアノコンクール (Piano Competition) (0) | 2022.03.17 |
[BOJ 6996 // C++] 애너그램 (0) | 2022.03.16 |
[BOJ 2485 // C++] 가로수 (0) | 2022.03.15 |