Nhà vô địch Frogger


11

Tro choi

Hầu hết chúng ta đều biết về Frogger , trò chơi arcade thời kỳ 80, trong đó mục tiêu là nhảy một con ếch an toàn qua đường cao tốc bận rộn và một cái ao đầy nguy hiểm để đến nhà an toàn.

Một thử thách đã được đưa ra vài tháng trước để phát triển bản sao Frogger. Nhưng tại sao lại nhân bản Frogger khi bạn có thể chơi Frogger? :)

Hãy xem xét lưới chơi đơn giản hóa sau:

 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

Chúng tôi có năm làn xe lưu thông, mỗi làn rộng 23 ô và hai vùng an toàn (nơi ếch có thể di chuyển an toàn sang trái và phải), cũng rộng 23 ô. Bạn có thể bỏ qua các biên giới bên phải và bên trái vì đây là cho rõ ràng hình ảnh.

Ếch của chúng tôi bắt đầu trong vùng an toàn phía nam, trên tế bào trung tâm (thứ 12), như được chỉ ra bởi một @trong hình trên.

Thời gian trong trò chơi được chia thành các bước riêng biệt được gọi là khung. Froggy là một con ếch nhanh và có thể nhảy một ô theo bất kỳ hướng nào (lên, xuống, phải, trái) trên mỗi khung. Anh ta cũng có thể chọn đứng yên cho bất kỳ khung hình nào. Giao thông trong năm làn di chuyển với tốc độ không đổi như sau:

  • giao thông ở làn tốc hành phía tây (làn 1) di chuyển 2 ô còn lại mỗi khung
  • giao thông trong làn đường phía đông chặn đường (làn 2) di chuyển 1 ô ngay mỗi khung hình thứ hai
  • giao thông trong làn đường phía tây giao thông tự do (làn 3) di chuyển 1 ô còn lại mỗi khung
  • giao thông trong làn đường phía tây bị chặn (làn 4) di chuyển 1 ô còn lại mỗi khung hình thứ hai
  • giao thông trong làn tốc hành phía đông (làn 5) di chuyển 2 ô ngay mỗi khung

Lưu lượng truy cập được xác định duy nhất cho khoảng. 3.000 dấu thời gian trong tệp văn bản này . "Giao thông" bao gồm các phương tiện và không gian giữa các phương tiện. Bất kỳ nhân vật không phải là một không gian là một phần của một chiếc xe. Tệp văn bản chứa năm dòng, tương ứng với năm làn lưu lượng (có cùng thứ tự).

Đối với các làn đường đi về hướng tây, khi bắt đầu khung 0 (bắt đầu trò chơi), chúng tôi coi phương tiện đầu tiên trong làn đường nằm ngay sát mép phải của lưới chơi.

Đối với làn đường hướng đông, chuỗi giao thông nên được coi là "lùi" theo nghĩa là các phương tiện xuất hiện bắt đầu từ cuối chuỗi. Khi bắt đầu khung 0, chúng tôi coi chiếc xe đầu tiên trong các làn này chỉ nằm ngoài rìa trái của sân chơi.

Hãy xem xét như một ví dụ:

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

Sau đó, lưới chơi sẽ xuất hiện như sau:

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

Sau khi tất cả lưu lượng trong một làn đường bị "cạn kiệt" (tức là hết chuỗi), chúng tôi coi tất cả các ký tự trong chuỗi là khoảng trắng.

Ếch của chúng tôi bị vắt nếu có bất kỳ điều nào sau đây xảy ra:

  • con ếch chiếm một tế bào bị chiếm giữ bởi một chiếc xe, trên bất kỳ khung nào
  • con ếch vẫn đứng yên trong làn tốc hành và một chiếc xe có chiều rộng 1 ô vượt qua anh ta trong khung đó
  • con ếch nhảy về phía đông "xuyên qua" một chiếc xe đi về hướng tây, hoặc nhảy về phía tây qua một chiếc xe đi về hướng đông
  • con ếch nhảy ra ngoài lưới 7 (dòng) bởi 23 (ô), trên bất kỳ khung nào

Lưu ý rằng đây là những điều kiện duy nhất mà theo đó một con ếch bị vắt. Cụ thể, một con ếch nhảy theo giao thông "với" là được phép, cũng như một con ếch nhảy vào hoặc ra khỏi một tế bào trong làn đường cao tốc được vượt qua bởi một phương tiện chiều rộng 1 trong cùng một khung.

Mục tiêu và chấm điểm

Mục tiêu của thử thách lập trình là đưa chú ếch băng qua đường nhiều lần nhất có thể trước khi chiếc xe cuối cùng thoát khỏi lưới chơi . Nghĩa là, chương trình chấm dứt ngay sau khi hoàn thành khung X , trong đó khung X là khung đầu tiên đưa lưới về trạng thái không có thêm phương tiện.

Đầu ra của chương trình của bạn phải là một chuỗi (hoặc tệp văn bản) chứa chuỗi di chuyển cho ếch bằng cách sử dụng mã hóa sau:

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

Ví dụ, chuỗi <<^.^chỉ ra rằng con ếch di chuyển sang trái hai lần, sau đó lên, sau đó tạm dừng cho một khung hình, sau đó di chuyển lên.

Một điểm được ghi bất cứ khi nào ếch vượt qua từ vùng an toàn phía nam đến vùng an toàn phía bắc và một điểm được ghi mỗi khi ếch vượt qua từ vùng an toàn phía bắc đến vùng an toàn phía nam.

Một số quy tắc quan trọng:

  1. Con ếch không được squished.
  2. Vui lòng gửi giải pháp của bạn (trình tự di chuyển) cùng với mã chương trình của bạn, theo dòng hoặc dưới dạng tệp văn bản (ví dụ: sử dụng pastebin.com).
  3. Ếch của chúng tôi là người biết trước và biết trước, do đó chương trình của bạn có thể sử dụng bất kỳ và tất cả dữ liệu lưu lượng truy cập trong bất kỳ khung nào trong khi tìm kiếm giải pháp. Điều này bao gồm dữ liệu cho lưu lượng truy cập chưa đến lưới phát.
  4. Lưới không quấn quanh. Thoát khỏi lưới sẽ khiến ếch bị vắt và do đó không được phép.
  5. Không có lúc nào lưu lượng truy cập "thiết lập lại" hoặc ếch "dịch chuyển tức thời". Các mô phỏng là liên tục.
  6. Con ếch có thể trở về vùng an toàn phía nam sau khi thoát khỏi nó, nhưng điều này không được tính là một điểm. Tương tự như vậy đối với vùng an toàn phía bắc.
  7. Người chiến thắng cuộc thi là chương trình tạo ra chuỗi di chuyển mang lại số lượng giao cắt cao nhất.
  8. Đối với bất kỳ câu hỏi hoặc mối quan tâm bổ sung, xin vui lòng hỏi trong phần ý kiến.

Đối với một số ưu đãi được thêm vào, tôi sẽ thêm tiền thưởng +100 đại diện cho chương trình chiến thắng khi tôi có thể làm như vậy.

Tiền thưởng

+ 2,5% cho điểm cơ bản * (tối đa + 10%) cho mỗi góc của lưới chơi mà ếch chạm vào. Bốn góc của lưới là các ô ngoài cùng bên phải và bên phải của hai vùng an toàn.

+ 25% cho điểm cơ bản * nếu chuỗi di chuyển của bạn giữ cho ếch bị giới hạn trong phạm vi +/- 4 ô bên trái hoặc bên phải của ô bắt đầu cho toàn bộ mô phỏng (tất nhiên anh ta có thể di chuyển tự do theo chiều dọc).

Không có phần thưởng cho điểm, nhưng các đạo cụ đặc biệt trong OP sẽ gửi tới bất kỳ ai đăng trình xác nhận giải pháp bẩn nhanh chóng để tôi không phải lập trình. ;) Một trình xác nhận đơn giản sẽ chấp nhận một chuỗi các bước di chuyển, đảm bảo tính hợp pháp của nó (theo các quy tắc và tệp lưu lượng truy cập) và báo cáo điểm số của nó (tức là tổng số giao cắt).

* Tổng số điểm bằng với điểm cơ bản cộng với tiền thưởng, làm tròn xuống số nguyên gần nhất.

Chúc may mắn đóng băng!


Cho bất cứ ai muốn đăng một trình xác nhận giải pháp: Vui lòng không đăng nó dưới dạng câu trả lời .
Geobits

Thật. Một liên kết đến mã trong một bình luận, hoặc như một phụ lục cho một giải pháp, sẽ là cách ưa thích để gửi một trình xác nhận.
COTO

Có phải khung đầu tiên trong đó các làn chậm tiến lên giống như khung đầu tiên trong đó các làn khác tiến lên hay một khung sau?
frageum

Ngoài ra, có thể ghi điểm bằng cách đạt đến endzone trên khung đầu tiên trong đó tất cả các xe đã xóa trường?
frageum

@feersum: Làn đường chậm tiến một khung hình sau. Họ vẫn bất động trong khung đầu tiên, như được chỉ ra trong ví dụ. Đối với con ếch ghi bàn ở khung cuối cùng: có, điều đó là có thể. Nếu con ếch đã di chuyển vào vùng an toàn trên cùng một khung mà chiếc xe cuối cùng ra khỏi sân chơi, một điểm sẽ được ghi.
COTO

Câu trả lời:


5

C ++: 176

Đầu ra:

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>>>>

Có dưới 8 triệu trạng thái kết hợp vị trí X thời gian X tập hợp các góc được truy cập, vì vậy chúng có thể được tìm kiếm toàn diện trong chưa đầy 1 giây. Nếu mã không có lỗi, nó sẽ không thể đánh bại. Chiến lược tối ưu là sử dụng toàn bộ bảng, vì điều đó cho phép froggy băng qua đường 160 lần, so với khoảng 120 khi bị giới hạn ở trung tâm. Tham quan các góc không tốn bất kỳ giao cắt nào vì giao thông quá nặng.

/* 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
Tôi không chắc chắn cách bạn xác định "trạng thái". Nếu chúng ta coi trạng thái hệ thống là cấu hình thời gian của chuyển động ếch, có khoảng 5 ^ 3000 trạng thái, tương ứng với cấu hình chuyển động cho 5 ^ 3000 đầu vào có thể (năm đầu vào có thể trên ~ 3000 khung hình). Rõ ràng chỉ một phần trong số này sẽ trở nên đáng ngưỡng mộ, nhưng số lượng trạng thái được chấp nhận sẽ không thể tìm kiếm theo hàng trăm đơn đặt hàng cường độ. Khi bạn gửi câu trả lời cuối cùng của mình, vui lòng gửi một danh sách các động thái cùng với nó.
COTO

Ngoài ra, trong trường hợp không rõ ràng, lưu ý rằng ếch có thể nhảy sang trái và phải khi tham gia giao thông, miễn là không có quy tắc "bị cắt xén" nào bị vi phạm. Bạn không bị giới hạn trong việc chờ đợi các cửa sổ nơi ếch có thể nhảy thẳng đứng mà không có chuyển động bên.
COTO

@COTO Trong tính toán của tôi về "các trạng thái", tôi đã quên một điều quan trọng, đó là số lượng giao cắt cho đến nay, vì vậy tôi đã cố gắng đưa ra một lời giải thích rõ ràng hơn. Thông số kỹ thuật được viết khá tốt. Có vẻ như lần đầu tiên tôi đã giải thích chính xác tất cả các vấn đề cụ thể này.
frageum

Tôi tính toán tối ưu là 162 + 10% = 178 giao cắt, nhưng của bạn là đủ gần. Tôi thực sự không muốn điều này trở thành khả năng vũ phu, nhưng rõ ràng tôi nên đưa ra vấn đề nhiều suy nghĩ hơn. Công bằng mà nói, tôi sẽ trao cho bạn 100 đại diện.
COTO

Rõ ràng tôi phải đợi 24 giờ trước khi trao giải "tiền thưởng". Vì lý do gì: ai biết. SE không muốn câu trả lời đúng giờ. Nếu chúng ta làm điều đó, những kẻ khủng bố sẽ giành chiến thắng. : O
COTO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.