※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 15488번 문제인 나이트가 체스판을 벗어나지 않을 확률이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/15488 

 

15488번: 나이트가 체스판을 벗어나지 않을 확률

첫째 줄에 N, 나이트의 좌표 x, y, 이동 횟수 K가 주어진다. (1 ≤ N ≤ 50, 1 ≤ x, y ≤ N, 0 ≤ K ≤ 50)

www.acmicpc.net

이동을 k번 한 뒤 좌표 (x1,y1)에 나이트가 있을 확률은 (이동을 k-1번 한 뒤 이 칸으로 올 수 있는 각 칸들에 도착할 확률) / 8을 합한 것과 같다는 점을 관찰하자.

 

위의 성질을 이용해 식을 세워 dp를 진행하는 것으로 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;
typedef long double ld;

int N, x, y, K;
ld board[51][50][50];

int dx[8] = { 1,2,2,1,-1,-2,-2,-1 };
int dy[8] = { 2,1,-1,-2,-2,-1,1,2 };

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> x >> y >> K;
	board[0][x - 1][y - 1] = 1;
	for (int i = 0; i < K; i++) {
		for (int x = 0; x < N; x++) {
			for (int y = 0; y < N; y++) {
				for (int k = 0; k < 8; k++) {
					int xx = x + dx[k], yy = y + dy[k];
					if (xx < 0 || xx >= N || yy < 0 || yy >= N) continue;
					board[i + 1][xx][yy] += board[i][x][y] / 8;
				}
			}
		}
	}

	ld ans = 0;
	for (int x = 0; x < N; x++) {
		for (int y = 0; y < N; y++) {
			ans += board[K][x][y];
		}
	}

	cout << fixed;
	cout.precision(20);
	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 20492 // C++] 세금  (0) 2022.11.22
[BOJ 21507 // C++] POBEDA-2014  (0) 2022.11.22
[BOJ 11434 // C++] Ampelmännchen  (0) 2022.11.22
[BOJ 26040 // C++] 특정 대문자를 소문자로 바꾸기  (0) 2022.11.21
[BOJ 26004 // C++] HI-ARC  (0) 2022.11.21

+ Recent posts