자바 스크립트 (ES6) 154 134 바이트
m=>m.map((r,Y)=>r.map(g=(_,x,y,r=m[y=1/y?y:Y])=>r&&r[x]&&[-1,0,1,2].map(d=>r[r[x]=0,/1/.test(m)?g(_,x+d%2,y+~-d%2):++n,x]=1)),n=0)|n/4
온라인으로 사용해보십시오!
어떻게?
방법
가능한 각 셀에서 시작하여 행렬을 플러딩하여 도중에 모든 셀을 지 웁니다. 행렬에 1 이 더 이상 포함되지 않을 때마다 가능한 경로 수 n 을 증가시킵니다 .
마지막 셀에서 선택한 방향으로 인해 각 유효한 경로는 4 번 계산되며 실제로는 중요하지 않습니다. 따라서 최종 결과는 n / 4 입니다.
재귀 함수
다음 과 같이 두 번째 map () 의 콜백에서 재귀 함수 g () 를 호출하는 대신 ...
m=>m.map((r,y)=>r.map((_,x)=>(g=(x,y,r=m[y])=>...g(x+dx,y+dy)...)(x,y)))
... 재귀 함수 g () 를 map () 의 콜백 으로 직접 정의합니다 .
m=>m.map((r,Y)=>r.map(g=(_,x,y,r=m[y=1/y?y:Y])=>...g(_,x+dx,y+dy)...))
y=1/y?y:Y
초기 값 y 를 설정하는 데 필요한 다소 긴 공식에도 불구하고 전체적으로 2 바이트를 절약합니다.
주석이 달린 코드
m => // given the input matrix m[][]
m.map((r, Y) => // for each row r[] at position Y in m[][]:
r.map(g = ( // for each entry in r[], use g() taking:
_, // - the value of the cell (ignored)
x, // - the x coord. of this cell
y, // - either the y coord. or an array (1st iteration),
// in which case we'll set y to Y instead
r = m[y = 1 / y ? y : Y] // - r = the row we're currently located in
) => // (and update y if necessary)
r && r[x] && // do nothing if this cell doesn't exist or is 0
[-1, 0, 1, 2].map(d => // otherwise, for each direction d,
r[ // with -1 = West, 0 = North, 1 = East, 2 = South:
r[x] = 0, // clear the current cell
/1/.test(m) ? // if the matrix still contains at least one '1':
g( // do a recursive call to g() with:
_, // a dummy first parameter (ignored)
x + d % 2, // the new value of x
y + ~-d % 2 // the new value of y
) // end of recursive call
: // else (we've found a valid path):
++n, // increment n
x // \_ either way,
] = 1 // / do r[x] = 1 to restore the current cell to 1
) // end of map() over directions
), // end of map() over the cells of the current row
n = 0 // start with n = 0
) | n / 4 // end of map() over the rows; return n / 4