[BOJ] 1405 미친 로봇

2024. 11. 30. 04:22·Problem-Solving/BOJ

 

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


문제

통제 할 수 없는 미친 로봇이 평면위에 있다. 그리고 이 로봇은 N번의 행동을 취할 것이다.

각 행동에서 로봇은 4개의 방향 중에 하나를 임의로 선택한다. 그리고 그 방향으로 한 칸 이동한다.

로봇이 같은 곳을 한 번보다 많이 이동하지 않을 때, 로봇의 이동 경로가 단순하다고 한다. (로봇이 시작하는 위치가 처음 방문한 곳이다.) 로봇의 이동 경로가 단순할 확률을 구하는 프로그램을 작성하시오. 예를 들어, EENE와 ENW는 단순하지만, ENWS와 WWWWSN

E는 단순하지 않다. (E는 동, W는 서, N은 북, S는 남)


요구하는 입출력 데이터에 맞게 작성해주면 문제입니다

효율적인 탐색을 위해서,

로봇 이동경로에 따라 visited 체크가 필요하고, dfs를 기반으로한 backtracking이 필요합니다


참고 포인트

 

1. 최종 출력값의 부동소수점 오차를 줄이기 위해(없애기 위해) 값을 곱한 뒤 100^N 으로 나눠서 처리하는 것이 좋습니다

    (단 이 경우 long long int의 범위를 초과하기 때문에 추가적인 연산 방법이 필요합니다)

-> 반올림 연산이 필요한 경우 정교한 처리를 위해 미리 반올림 자릿수만큼 10^N을 곱하는 것과 유사한 테크닉입니다

 

2. 단순하게 브루트포스로 풀 수도 있다 4^14 == 2^28 ≒ 268,435,456 < int(3e8) 이므로 약 1초의 시간이 소요됩니다

    (이는 채점 서버의 환경 혹은 상태에 따라 달라질 수 있습니다)

 

1초당 연산량 추가 참고 자료

https://www.acmicpc.net/board/view/55142

https://www.acmicpc.net/board/view/59336

 

my solution >>

#include <bits/stdc++.h>
using namespace std;

int px[4] = {0, 0, 1, -1};
int py[4] = {1, -1, 0, 0};

void btr(int n, int move_cnt, int x, int y, bool board[][50], double& ans, vector<double>& prcts, double val){
    board[x][y] = true;
    if(n == move_cnt){
        ans += val;
        board[x][y] = false;
        return;
    }

    for(int p=0; p<4; ++p){
        int nx = x+px[p], ny = y+py[p];
        if(board[nx][ny]) continue;
        if(prcts[p] == 0) continue;
        btr(n, move_cnt+1, nx, ny, board, ans, prcts, val*(prcts[p]/100));
    }
    board[x][y] = false;
}

int main(void){
    int n; cin >> n;
    vector<double> prcts(4); for(auto &prct:prcts) cin >> prct;

    double ans = 0.0;
    bool board[50][50];
    fill(&board[0][0], &board[0][0]+50*50, false);

    board[25][25] = true;
    btr(n, 0, 25, 25, board, ans, prcts, 1);

    cout << fixed;
    cout.precision(10);
    cout << ans;
}

 

'Problem-Solving > BOJ' 카테고리의 다른 글

node.js 환경에 CPH(Competitive Programming Helper) 활용하기  (2) 2025.03.18
[BOJ] 1600 말이 되고픈 원숭이 (cpp)  (16) 2025.01.06
[BOJ] 18712 Ice-cream Knapsack  (13) 2024.11.26
[BOJ] 21820 Acowdemia I  (13) 2024.10.05
'Problem-Solving/BOJ' 카테고리의 다른 글
  • node.js 환경에 CPH(Competitive Programming Helper) 활용하기
  • [BOJ] 1600 말이 되고픈 원숭이 (cpp)
  • [BOJ] 18712 Ice-cream Knapsack
  • [BOJ] 21820 Acowdemia I
clearvyu
clearvyu
Hello, Stranger
  • clearvyu
    clearvyu
    clearvyu
  • 전체
    오늘
    어제
    • 분류 전체보기 (11)
      • Show (1)
      • Study(Group) (1)
        • Google Study Jams (1)
      • Problem-Solving (5)
        • BOJ (5)
      • Embedded (3)
        • Setting (2)
      • ToDo (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    오블완
    라즈베리파이
    PS
    problem-solving
    미친 로봇
    공간복잡도 개선
    말이 되고픈 원숭이
    백준
    backjoon online judge
    티스토리챌린지
    세팅
    임베디드
    build profiling
    ubuntu 22.04.5 lts (64-bit)
    Setting
    구글 클라우드 스터디 잼
    BOJ
    unity6 roadshow
    competitive programming helper
    구글 스터디 잼
    Debian
    라즈베리파이4
    ice-cream knapsack
    cph
    hands-on training
    Embedded
    Raspberry Pi 4
    baekjoon online judge
    google cloud study jam
    18712
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
clearvyu
[BOJ] 1405 미친 로봇
상단으로

티스토리툴바