프로 거 챔피언


11

게임

우리 대부분은 80 년대 아케이드 게임 인 Frogger 에 대해 알고 있습니다.이 게임의 목표는 바쁜 고속도로와 위험이 가득한 연못을 안전하게 개구리를 뛰어 넘어 집에 안전하게 도착하는 것입니다.

도전이 발행 프로 거 클론을 개발하기 위해 몇 달 전에. 그러나 Frogger를 재생할 수 있는데 왜 Frogger를 복제 해야 합니까? :)

다음과 같은 단순화 된 재생 그리드를 고려하십시오.

 XXXXXXXXXXXXXXXXXXXXXXX  North Safe Zone
 -----------------------
|                       | <<<<       Express Lane West        (Lane 1)
|                       |     >      Gridlock East            (Lane 2)
|                       |   <<       Freeflowing Traffic West (Lane 3)
|                       |    <       Gridlock West            (Lane 4)
|                       |     >>>>   Express Lane East        (Lane 5)
 -----------------------
 XXXXXXXXXXX@XXXXXXXXXXX  South Safe Zone
 \__________ __________/
            '
  23 cells horizontally

우리는 각각 23 개의 셀 폭과 5 개의 레인을 가지고 있으며 2 개의 안전 지대 (개구리가 좌우로 안전하게 이동할 수있는 곳)와 23 개의 셀 폭을 가지고 있습니다. 그림의 명확성을 위해 오른쪽과 왼쪽 테두리를 무시해도됩니다.

우리의 개구리 @는 위 그림에 표시된 것처럼 중앙 안전 구역의 중앙 (12 번째) 칸 에서 시작합니다.

게임의 시간은 프레임이라는 개별 단계로 나뉩니다. Froggy는 빠른 개구리이며 프레임 당 한 방향으로 (위, 아래, 오른쪽, 왼쪽) 하나의 셀을 홉핑 할 수 있습니다. 그는 또한 어떤 프레임에서도 정지 상태를 유지하도록 선택할 수 있습니다. 5 개 차선의 교통량은 다음과 같이 일정한 속도로 이동합니다.

  • 급행 차선 서쪽 (1 차선)의 교통량은 매 프레임마다 2 개의 셀을 왼쪽으로 이동합니다.
  • Gridlock East Lane (레인 2)의 트래픽은 매 2 초마다 1 셀씩 이동합니다.
  • 프리 플로우 트래픽 서쪽 차선 (레인 3)의 트래픽은 매 프레임마다 1 셀씩 이동합니다.
  • gridlock 서쪽 차선 (레인 4)의 트래픽은 매 2 프레임마다 1 셀씩 이동합니다.
  • 고속 차선 이스트 (5 차선)의 트래픽은 매 프레임마다 2 개의 셀을 오른쪽으로 이동합니다.

트래픽 자체는 대략적으로 이 텍스트 파일 에서 3,000 개의 타임 스텝 . '교통'은 차량과 차량 사이의 공간으로 구성됩니다. 공백이 아닌 문자는 차량의 일부입니다. 텍스트 파일에는 5 개의 트래픽 레인 (동일한 순서)에 해당하는 5 개의 라인이 있습니다.

서쪽 차선의 경우, 프레임 0의 시작 (게임 시작)에서 차선의 첫 번째 차량이 경기장의 오른쪽 가장자리를 넘어서는 것으로 간주합니다.

동쪽으로가는 차선의 경우, 차량 이 줄 에서 시작하는 것처럼 보이기 때문에 교통 줄은 "뒤로"고려되어야 합니다. 프레임 0의 시작에서, 우리는이 차선의 첫 번째 차량이 경기장의 왼쪽 가장자리 바로 위에 있다고 생각합니다.

예를 들면 다음과 같습니다.

Traffic Lane 1:  [|==|  =
Traffic Lane 2:  |) =  o
Traffic Lane 3:  (|[]-[]:
Traffic Lane 4:  <| (oo|
Traffic Lane 5:  |==|] :=)

그러면 재생 그리드가 다음과 같이 나타납니다.

Start of Frame 0       XXXXXXXXXXXXXXXXXXXXXXX
                                              [|==|  =
                |) =  o
                                              (|[]-[]:
                                              <| (oo|
              |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 1       XXXXXXXXXXXXXXXXXXXXXXX
                                            [|==|  =
                |) =  o
                                             (|[]-[]:
                                              <| (oo|
                |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 2       XXXXXXXXXXXXXXXXXXXXXXX
                                          [|==|  =
                 |) =  o
                                            (|[]-[]:
                                             <| (oo|
                  |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 3       XXXXXXXXXXXXXXXXXXXXXXX
                                        [|==|  =
                 |) =  o
                                           (|[]-[]:
                                             <| (oo|
                    |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

레인의 모든 트래픽이 "고갈"된 후 (즉, 문자열이 소진 된 후) 문자열의 모든 문자를 공백으로 간주합니다.

다음 중 하나가 발생하면 개구리가 죽습니다 .

  • 개구리는 어떤 프레임에서든 차량이 차지하는 세포를 점유합니다.
  • 개구리는 급행 차선에서 정지 상태를 유지하고 1 셀 폭의 차량이 그 프레임에서 그를지나갑니다.
  • 개구리는 서쪽으로 향하는 차량을 통해 동쪽으로 점프하거나 동쪽으로 향하는 차량을 통해 서쪽으로 점프합니다
  • 개구리는 어떤 프레임에서든 7 (선) 바깥쪽으로 23 (셀) 플레잉 그리드를 뛰어 넘습니다.

이것은 개구리가 뭉개지 는 유일한 조건입니다. 특히, "with"트래픽을 따라 호핑하는 개구리는 동일 프레임에서 폭 1 차량에 의해 지나가는 급행 차선에서 셀 내외로 점프하는 개구리와 같이 허용된다.

목표와 채점

프로그래밍 챌린지의 목표는 마지막 차량이 플레잉 그리드를 빠져 나가기 전에 가능한 한 길을 건너 개구리를 길들이는 것입니다 . 즉, 프로그램은 프레임 X 의 완료 직후에 종료되며 , 여기서 프레임 X 는 그리드가 더 이상 차량이없는 상태가되는 첫 번째 프레임입니다.

프로그램의 출력은 다음 인코딩을 사용하여 개구리의 이동 순서를 포함하는 문자열 (또는 텍스트 파일)이어야합니다.

<   frog moves left
>   frog moves right
^   frog moves up
v   frog moves down
.   frog remains stationary

예를 들어, 문자열 <<^.^은 개구리가 왼쪽으로 두 번 움직 인 다음 위로 움직 인 다음 한 프레임 동안 일시 정지 한 다음 다시 위로 움직인다는 것을 나타냅니다.

개구리가 남쪽 안전 지대에서 북쪽 안전 지대로 교차 할 때마다 1 점을 획득하고 개구리가 북쪽 안전 지대에서 남쪽 안전 지대로 교차 할 때마다 1 점을 얻습니다.

몇 가지 중요한 규칙 :

  1. 개구리는 찌그러져서는 안됩니다.
  2. 프로그램 코드와 함께 솔루션 (이동 순서)을 인라인 또는 텍스트 파일 (예 : pastebin.com 사용)로 게시하십시오.
  3. 우리의 개구리는 예쁘고 인식이 뛰어나므로 프로그램은 솔루션을 찾는 동안 모든 프레임의 모든 트래픽 데이터 를 사용할 있습니다. 여기에는 아직 재생 그리드에 도달하지 않은 트래픽에 대한 데이터가 포함됩니다.
  4. 그리드가 줄 바꿈되지 않습니다. 그리드를 종료하면 개구리가 뭉개져 허용되지 않습니다.
  5. 어느 시점에서도 트래픽이 "재설정"되거나 개구리가 "텔레포트"로 설정되지 않습니다. 시뮬레이션은 연속적입니다.
  6. 개구리는 탈출 한 후 남쪽의 안전 지대로 돌아올 수 있지만 이것은 한 지점으로 계산되지 않습니다. 북쪽 안전 지대도 마찬가지입니다.
  7. 컨테스트 당첨자는 가장 많은 건널목을 생성하는 이동 시퀀스를 생성하는 프로그램입니다.
  8. 추가 질문이나 문제가 있으면 의견 섹션에 자유롭게 문의하십시오.

추가 인센티브를 위해, 나는 그렇게 할 수있을 때 우승 프로그램 에 +100 의 현상금을 추가 할 것입니다.

보너스

개구리가 터치하는 그리드의 구석 구석마다 기본 점수 + 2.5 % * (최대 + 10 %). 그리드의 네 모서리는 두 안전 구역의 가장 왼쪽과 오른쪽 셀입니다.

이동 순서가 개구리를 전체 시뮬레이션을 위해 시작 셀의 왼쪽 또는 오른쪽 +/- 4 개 셀에 갇힌 상태로 유지하는 경우 기본 점수에 +25 % * (물론 세로로 자유롭게 움직일 수 있음).

점수 보너스는 없지만 OP의 특수 소품은 빠른 솔루션 검사기를 게시 한 사람에게 전달되므로 프로그래밍 할 필요가 없습니다. ;) 검증 인은 단순히 일련의 움직임을 받아들이고, 규칙과 교통 파일에 따라 적법성을 보장하며, 점수 (예 : 총 건널목 수)를보고합니다.

* 총 점수는 기본 점수에 보너스를 더한 값과 같으며 가장 가까운 정수로 내림합니다.

행운을 빌어 요!


솔루션 유효성 검사기를 게시하려는 사람에게 : 답변으로 게시하지 마십시오 .
Geobits

과연. 주석 또는 솔루션의 부록으로 코드에 대한 링크는 유효성 검증기를 제출하는 선호되는 방법입니다.
COTO

느린 차선이 진행되는 첫 번째 프레임이 다른 차선이 진행되는 첫 번째 프레임과 같거나 한 프레임 이후에 있습니까?
feersum

또한 모든 차량이 필드를 클리어 한 첫 번째 프레임에서 엔드 존에 도달하여 득점 할 수 있습니까?
feersum

@feersum : 느린 차선은 한 프레임 후에 전진합니다. 예제에 표시된 것처럼 첫 번째 프레임에서 움직이지 않습니다. 가장 마지막 프레임에서 개구리 득점에 관해서는 가능합니다. 개구리가 마지막 차량이 경기장에서 나가는 것과 같은 프레임에서 안전 지대로 이동 한 경우 1 점을 얻습니다.
COTO

답변:


5

C ++ : 176

산출:

176
^^^^^^>vvvvvv>^^^^>^^>>>>>>><<<.vv>v<<<.vvv<<<<<<^.^.^.^.>.>^^<.>>>>>>v>v>.>v<<<<v.<.vv<<<<<^^.<^<<<<<<^.^^>>>>vv>.>.v<v.vv>>^>>^<^<<<<<<<^>.>^^<<<.>>>>>vv>v<vvv<<<<<^^.<^^^^.....vv>.>.>.>v<<vvv<<>>>>^>^<.<.^^>^^>>>>vv.>v<vv.v^>^<.<.<^<^>.>^^>>>>vv.v<<<<<<.vvv<<<<^^^<<v^^.>.^^..>>>>>>vv>.>.v.vvv>>>^>^^<<<<<<<<<^>.>^^>>>>vvv<<v.<.vv<<<<<<>>>>>^^^<<<^^^<<>>vv>.v<<>vvv<<><>>>>>>>^>^^<^^^<.>>>>>>>>vv>.>v<<<vvv<<<<<^^^<<v.<.<^<<^.^<<^...>>>>>>>>>>>>>vv>v<vvv<<<<<<<<^>^.<.^^>.>^^<<<<<<<..>>>>vv>.vvvv<<<<>^.v>>>^^.^^>^<^<>>>>>>>>>vv>vvvv<<<<^^^<^>^<<^.>>vv>v<vvv<<<<<<<>>>>>>>^>^^^.^^>>>>>vvv<<vvv<<<^^^^^^<vvv<<<<<<<vvv<<<>>>>>>>>^^.<.<.^.^.^<^<>>>>>>>>>>vvv<<.vvv<<<^^<^<<^^<<^<<<>>>>vv>.vvvv>>^>>^<.<.<^<<<<<.^^<<^.......>vv.>.>.>v<vvv>>>>>>^>^.<.<^<.^^^<.>>>>>>>vvv<<<v.<vv<<<^^<.<.<.<^<<<^>^^..........v<vvvv>v>>>>>^>>^^^>^^>>>vv>v<vvv<<<<<<<<>^^.<.<^<^^^<.........>vv.>.vvvv>>>>^^<.<.<^^^<^<<.v<v>.>.>.>.>.>.>.vvv.v<<<<<^^<^<^>.>.>.>.^<^.>>>>>>>>vv>v<<vvv<<>>>>>^^^.^.>^<^<<<<<<<<.vv.>.v<<<.vvv<>>>>>^>^.<.<.<.<^^.^<<^<.....>>vvv<.>>vvv<<<>>>>>>>>^^^<<<.^.>.>^^.>>>>>vv.>v<vvv<<<>>>>>>^>^<^<<^.^^<vvv<<<<<vv.v<>>>>>>>>>>^>^.^^>^^<<<<.>vv.>.vvvv>^>>^.<.<.<^<<<^>^^>>>vv>v<<<<<vvv<<<>>>>>^^<.<.<.<.<^<^>.^^.>>>>>vv>v<>vvv<<<<<<<^>^.<^<<<<<<<^^^.>>>>>vv>v<>vvv>>>^^<.<^<<<^>^^.>>>>vv>.v<<vvv<<<<<^^^<<<<<^>.^^<>>>>>>>vv>.>v<<vvv<<<<<<<>>>^>>.>^^^.>^^<>>>>>>vv>vv.<.<.vv>>>>^^<.<.<.<^<<^.>^^.>>>>>vv.>.>v<<vvv<<>>>>>^^<.<.<.^^>.>.>^^<<<<<<<<.>>>>>>vv>v<<v.<.<vv<<<<^^.<^<<<.^^^<.vv.>v<vvv<<<>>>>>>^>^<^<<^.^<^<<.>>vv>.>.>.>vvvv>>>>>>^>^^^^^<<<.vvv<<<<<<vvv>>>>>^>^<.<^<<^.>.>.^^>>>>vv>.>v<<<<<<vvv<<<<^^^<.^.>^^>>>>vvv<<v.vv<<<^>>^^<<<.^^<<^>>>>>>>>>vvv.v.vv<>>>>>^>^^<<<<<<<<<<<<<<<<^^^..>>>>>vv>.>.>.>v<<v.<.<.vv<<<<<^^^<^>.^^...>>>>>>>>vv.v<.vvv>>>^>^<.<^^^^>>>vv>v<<<vvv<<<<>>>>>>^>^.<.<^<^>.>^^.>>>>>vv.v<<<<<<<<vvv<<<<^^<^<<<<<><^>.>^^>>>>vv.>.>.vvv.v>>>>>>>^^<.<^<<^^^>>>vv>.>.>.>.>v<<v.<.<vv>>>>^^^<<<<<.^.>^^>>>vv>.>v<vvv<<<<^^<.<.<.^^>^^>>>vv>.>.v<<<v.<vv<<<<^^.<^<<<^^^>>>>vvvvvv<<<<<<<<>^^.^>>^^^<>>>>>>>vvv<<<v.vv>>>>>^>>^^<<<<<^>.^^>>>>vv>.>v<<<<vvv<<<^^<.<.<.<^<<<<<^>^^>>>>vv.>vv.v.v<^>.>^.<.^^^^>>>>vv>.>.>.v<<<<<<vvv>>>>^^<.<.<^<<^^<^>>>>>>vv>v<<.vvv^>^^<<<^>^^<<<<<<.vvv<<vv>.v>>>>>>^>.>^^<<<<<^>.>.>.>.>.^^>>>>vv>.>.>v<<<<<vvv<<<<^^<^<<^.^^>>>>vv>.>.>.>v<vvv<<<<<^^.<.<^<<^^^>>>>>>>>>>>vv>.>.>.>.>vvvv<<<<^^.<.<^<^^^<<<<<<vvv<v.<vv<<<<^v>>>>>>>>>>^^^<.^.>.>.^^>>>>vvv<<<<<<<vvv<<<<<<<>^^.<^<.^^^.>>>>vv>v<vvv<>>>>^^.<.^.^.>.^<^>>>>>>>>vvvv.<.<vv<<<<^^^<<<<<^>.^^<.vv>.v<<vvv<<><>>>>>^>>^.<^<^^^<<<.>>vv>.>v<<<<v.vv>^>>^.<^^.^^.>>>>>vv>.>.>.v<v.<vv<<<<<^.^^^.>^^<>>>>>>vv>.v<<<v.<vv<<<<>>>>>>>>>>>^^<.<.<.<.<^<<^^<^<<<>>>>>>>vv>v<<<vv.v>>>>>>>>^>^<.<^<<<<<<<<<<<.^.>^^<<<vvv.v.<vv<<<^.>>^.<^^.>.>^^<<......vv.v>vvv>>>^.v^>>^^<<^^^<.>>>>>>>vvv<v.<.<.vv<<<<^^<.<.<.^^^^<.>>>>>>>>vvv<v.<vv^.>^^<<^^^vv>vvvv^>>>>>>>^^^^^vvvvvv^^^^^^vvvvvv>>>>

위치 X 시간 X 방문 코너 세트의 8 백만 개 상태 조합이 있으므로 1 초 이내에 철저하게 검색 할 수 있습니다. 코드에 버그가 없으면 이길 수 없습니다. 최적의 전략은 전체 보드를 사용하는 것이 었는데, 그 이유는 개구리가 도로에 160 번, 중앙에 갇혀있을 때 약 120 번을 통과 할 수 있기 때문입니다. 교통량이 너무 많아서 코너를 방문하는 데는 건널목이 없었습니다.

/* feersum  2014/9
 /codegolf/37975/frogger-champion */

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>

#define B(F, CST, X, Y) best[ ((F)*NCST + (CST)) * BS + (Xmax-Xmin+1) * ((Y)-Ymin) + (X)-Xmin]
#define TL(i) ((int)t[i].length())
#define ABSPEED(I) (speed[i]<0?-speed[i]:speed[i])
#define errr(X) { cout<<"ERROR!!!!!!!!"; return X; }

#define DRAW 0
#if DRAW
    #include <unistd.h>
#endif


using namespace std;

int bc(int cs) {
    int c = 0;
    while(cs) {
        c += cs&1;
        cs >>= 1;
    }
    return c;
}

int main()
{
    const bool bonusTwentyfive = false;
    const int COLS = 23, T_ROWS = 5, YGS = T_ROWS + 2, XGS = COLS + 2;
    string t[5];
    int speed[] = {-4, 1, -2, -1, 4};
    ifstream f("t.txt");
    for(int i = 0; i < T_ROWS; i++)
        getline(f, t[i]);
    if(f.fail())
        return 1;
    f.close();
//for(int i = 0; i < 5; i ++)t[i]="xxx";

    char g[XGS][YGS];

    int mov[][3] = { {-1,  0, '<'},
                     {+1,  0, '>'},
                     { 0, -1, '^'},
                     { 0, +1, 'v'},
                     { 0,  0, '.'} };


    int Ymin = 0, Ymax = YGS-1;


    const int Xstart = 11, Xmaxmove = bonusTwentyfive ? 4 : 10;
    const int Xmin = Xstart - Xmaxmove, Xmax = Xstart + Xmaxmove;

    const int NCST = bonusTwentyfive ? 1 : 1<<4;

    int maxfr = 0;
    for(int i = 0; i < T_ROWS; i++) {
        if(speed[i] < 0) {
            for(int m = 0, n = t[i].length()-1; m < n; ++m,--n)
                swap(t[i][m], t[i][n]);
        }
        int carslen = TL(i);
        for(char*c = &t[i][speed[i]>0?TL(i)-1:0]; carslen; carslen--, speed[i]>0?--c:++c)
            if(*c != ' ')
                break;
        if(carslen)
            maxfr = max(maxfr, ( (carslen + COLS) * 2 + ABSPEED(i)-1 ) / ABSPEED(i));
    }
    const int BS = (Xmax-Xmin+1)*(Ymax-Ymin+1);
    int *best = new int[(maxfr+1)*NCST*BS];
    memset(best, 0xFF, (maxfr+1)*NCST*BS*sizeof(int));
    memset(g, ' ', sizeof(g));
    B(0, 0, Xstart, Ymax) = 0;

    for(int fr = 0; fr < maxfr; fr++) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;
                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(N > B(fr+1, cs|csor, X, Y))
                            B(fr+1, cs|csor, X, Y) = N;
                    }


                }
            }
        }
    }

    int score = 0, xb, yb, cb, nb;
    for(int x = Xmin; x <= Xmax; x++) {
        for(int y = Ymin; y <= Ymax; y++) {
            for(int cs = 0; cs < NCST; cs++) {
                if(B(maxfr, cs, x, y) * (40 + bc(cs)) / 40 >= score) {
                    score = B(maxfr, cs, x, y) * (40 + bc(cs)) / 40;
                    xb = x, yb = y, cb = cs, nb = B(maxfr, cs, x, y);
                }
            }
        }
    }
    char *mvs = new char[maxfr+1];
    mvs[maxfr] = 0;

    for(int fr = maxfr-1; fr >= 0; --fr) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;

                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(X==xb && Y==yb && N == nb && (cs|csor) == cb) {
                            mvs[fr] = mov[m][2];
                            xb = x, yb = y, nb = B(fr, cs, x, y), cb = cs;
                            goto fr_next;
                        }
                    }
                }
            }
        }
        errr(3623);
        fr_next:;
    }

    if((xb-Xstart)|(yb-Ymax)|nb)
        errr(789);
    #if DRAW

        for(int fr = 0; fr <= maxfr; ++fr) {
            memset(g, ' ', sizeof(g));
            for(int r = 0; r < T_ROWS; r++) {
                for(int x = 0; x < XGS; x++) {
                    int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                    ind >= 0 && ind < TL(r) ? g[x][r+1] = t[r][ind] : ' ';
                }
            }
            g[xb][yb] = 'F';
            for(int y = 0; y < YGS; y++) {
                for(int x = 0; x < XGS; x++)
                    cout<<g[x][y];
                cout<<endl;
            }
            cout<<string(XGS,'-')<<endl;
            usleep(55*1000);
            for(int i = 0; i < 5; i++) {
                if(mvs[fr] == mov[i][2]) {
                    xb += mov[i][0];
                    yb += mov[i][1];
                    break;
                }
            }
        }

    #endif
    cout<<score<<endl;
    cout<<mvs<<endl;
}

1
"상태"를 어떻게 정의하고 있는지 잘 모르겠습니다. 시스템 상태를 개구리 모션의 시간 프로파일로 간주하면 5 ^ 3000 개의 가능한 입력 (~ 3000 프레임 당 5 개의 가능한 입력)에 대한 모션 프로파일에 해당하는 약 5 ^ 3000 개의 상태가 있습니다. 분명히 이들 중 일부만이 허용 가능한 것으로 판명되지만, 허용 가능한 주 수는 수백 배 정도는 검색 할 수 없습니다. 최종 답변을 제출할 때 함께 이동 목록을 제출하십시오.
COTO

또한 명확하지 않은 경우 , "고정 된"규칙을 위반하지 않는 한, 개구리 교통 체증 중에 왼쪽과 오른쪽으로 점프 할 수 있습니다 . 개구리가 옆으로 움직이지 않고 수직으로 뛸 수있는 창문을 기다리는 것에 만 국한되지 않습니다.
COTO

@COTO "상태"를 계산할 때 중요한 점, 즉 지금까지 교차 횟수를 잊어 버렸기 때문에 더 명확하게 설명하려고했습니다. 사양은 꽤 잘 작성되었습니다. 이러한 모든 특정 문제를 처음으로 올바르게 해석 한 것 같습니다.
feersum

나는 162 + 10 % = 178 교차점으로 최적을 계산하지만 당신은 충분히 가깝습니다. 나는 이것이 정말로 무력한 것으로 판명되기를 원하지 않았지만, 분명히 그 문제에 대해 더 많은 생각을했을 것입니다. 공정하게, 나는 당신에게 100 명의 대표자를 수여 할 것입니다.
COTO

분명히 "현상"을 수여하기 전에 24 시간을 기다려야합니다. 어떤 이유로 : 누가 알 겠어요. SE는 정답으로 보상받은 답변을 원하지 않아야합니다. 그렇게하면 테러리스트들이 이길 것입니다. : O
COTO
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.