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已访问拐角集的状态组合少于800万,因此可以在不到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;
}