C, 262 260
골프 코드 (디버깅 코드 및 불필요한 공백 제거. stdin을 통한 입력에서 명령 행을 통한 입력으로 변경되었으며 변수 i를 선언 할 수있는 기회를 활용했습니다. 최신 편집 : 코드는 for
루프의 대괄호로 이동하여 두 개의 세미콜론을 저장했습니다.)
t[420],j,l,x,y;f(p,d){int z,q,k;for(k=6;k--;t[q]&!t[p+z]?t[q]=0,f(q,d+1),t[q]=1:0)z="AST?-,"[k]-64,q=p+z*2;l=d>l?d:l;}main(int i,char**s){for(i=840;i--;x>3&y>5&x+y<23|x<13&y<15&x+y>13?i>420?t[i-420]=49-s[1][j++]:t[i]||f(i,0):0)x=i%20,y=i/20%21;printf("%d",l);}
설명
이것은 20x21 보드에 의존하며 프로그램이 시작될 때 처음에는 0으로 채워집니다 (이 ASCII 아트는 프로그램의 수정 된 버전에 의해 생성되었으며 i
루프가 아래쪽으로 내려감에 따라 0은 오른쪽 하단 모서리에 있음).
....................
....................
...............#....
..............##....
.............###....
............####....
.......#############
.......############.
.......###########..
.......##########...
.......#########....
......##########....
.....###########....
....############....
...#############....
.......####.........
.......###..........
.......##...........
.......#............
....................
....................
i
x와 y를 사용하여 정사각형이 실제로 바둑판에 속하는지 여부를 계산하기 위해 루프 가이 보드를 두 번 실행됩니다 (여기서 x와 y에 6 개의 별도 부등식이 필요합니다).
만약 그렇다면, 그것은 라운드 첫 시간은 사각형, 퍼팅 채우고 0
A의 (falsy)을 1
(점유)와 1
A의 (truthy) 0
(빈)을. 모든 범위를 벗어난 사각형에는 이미 0이 포함되어 있기 때문에이 반전은 중요합니다. 즉, 점유 된 사각형과 유사하며 특정 검사가 필요하지 않고 뛰어 넘을 수 없습니다.
두 번째 라운드는 사각형이 점유되면 (0 포함) f
이동을 검색 하는 함수 를 호출합니다 .
f
식에서 인코딩 된 +/- 1 (수평), +/- 20 (수직) 및 +/- 19 (대각선)으로 인코딩 된 6 가지 가능한 방향으로 재귀 적으로 검색합니다 "AST?-,"[k]-64
. 적중을 찾으면 재귀 적으로 호출하기 전에 해당 셀을 0 (점유)으로 설정 한 다음 함수가 리턴 될 때 다시 1 (비어 있음)로 설정합니다. 해당 셀에 두 번 이상 호핑되지 않도록 재귀 호출 전에 셀 값을 변경해야합니다.
Ungolfed 코드
char s[999]; //input string.
t[420],i,j,l,x,y; //t=board. i=board counter, j=input counter. l=length of longest hop found so far.
f(p,d){ //p=position, d= recursion depth.
//printf("%d,%d ",p,d); //debug code: uncomment to show the nodes visited.
int k,z,q; //k=counter,z=displacement,q=destination
for(k=6;k--;) //for each direction
z="AST?-,"[k]-64, //z=direction
q=p+z*2, //q=destination cell
t[q]&!t[p+z]? //if destination cell is empty (and not out of bounds) and intervening cell is full
t[q]=0,f(q,d+1),t[q]=1 //mark destination cell as full, recurse, then mark it as empty again.
:0;
l=d>l?d:l; //if d exceeds the max recorded recursion depth, update l
}
main(){
gets(s); //get input
for(i=840;i--;) //cycle twice through t
x=i%20, //get x
y=i/20%21, //and y coordinates
x>3&y>5&x+y<23|x<13&y<15&x+y>13? //if they are in the bounds of the board
i>420?
t[i-420]=49-s[j++] //first time through the array put 0 for a 1 and a 1 for a 0 ('1'=ASCII49)
:t[i]||f(i,0) //second time, if t[i]=0,call f().
//,puts("") //puts() formats debug output to 1 line per in-bounds cell of the board
:0;
printf("%d",l); //print output
}