매스 매 티카, 326325 바이트
바이트 절약을 알려 주신 masterX224에 감사드립니다!
f[g_,w_,x_]:=(c={{1,1},{-1,1}};s=c.c/2;e=#<->#2&@@@#&;j=Join;h=FindShortestPath;t=#~Tuples~2&;a@d_:=e@Select[t@g,#-#2&@@#==d&];y@k=j@@(a/@j[s,c]);y@n=j@@(a/@{{1,2},{2,1},{-2,1},{-1,2}});v=Flatten[e@t@#&/@ConnectedComponents@a@#&/@#]&;y@r=v@s;y@b=v@c;Pick[p={b,k,n,r},z=Length[h[y@#,w,x]/.h@__->0]&/@p,Min[z~Complement~{0}]]);
함수 정의 f
세 개의 인수를 복용은 : g
보드를 나타내는 정수의 순서쌍의 목록이며, w
그리고 x
시작과 끝 사각형을 나타내는 쌍을 주문했다. 출력은 {b, k, n, r}
두 개의 사각형 사이에 최소 이동 경로가있는 (주교, 왕, 기사 및 루크를 나타내는) 하위 집합입니다 . 예를 들어, 세 번째 테스트 케이스에 의해 호출 f[{{0, 0}, {1, 1}, {1, 2}, {0, 3}}, {0, 0}, {0, 3}]
반환 {k}
; 마지막 두 테스트 케이스는 반환 {k, n}
및 {}
각각.
전략은 보드의 정사각형을 그래프의 정점으로 변환하는 것입니다.이 정점은 각 조각의 움직임에 따라 가장자리가 결정되며 내장 된 그래프 루틴을 사용합니다.
보다 사용자 친화적 인 코드 버전 :
1 f[g_, w_, x_] := ( c = {{1, 1}, {-1, 1}}; s = c.c/2;
2 e = # <-> #2 & @@@ # &; j = Join; h = FindShortestPath; t = #~Tuples~2 &;
3 a@d_ := e@Select[t@g, # - #2 & @@ # == d &];
4 y@k = j @@ (a /@ j[s, c]);
5 y@n = j @@ (a /@ {{1, 2}, {2, 1}, {-2, 1}, {-1, 2}});
6 v = Flatten[e@t@# & /@
7 ConnectedComponents@a@# & /@ #] &;
8 y@r = v@s; y@b = v@c;
9 Pick[p = {b, k, n, r},
10 z = Length[h[y@#, w, x] /. h@__ -> 0] & /@ p,
11 Min[z~Complement~{0}]]
12 );
3 행에서 Select[g~Tuples~2, # - #2 & @@ # == d
차이가 벡터 인 모든 정점 쌍을 찾습니다 d
. e
그런 다음 순서가 지정된 각 쌍을 방향이 지정되지 않은 그래프 가장자리로 변환합니다. 따라서 a
, 고정 벡터 차이 모든 꼭지점 사이의 에지를 생성하는 함수이다.
4, 5 행에서 왕의 그래프를 정의하기에 충분합니다. y@k
(벡터에 의해 생성 된 가장자리의 결합을 얻어 {1, 1}
, {-1, 1}
, {0, 1}
, 및 {-1, 0}
) 및 나이트의 그래프 y@n
(와 동일한 않는 {1, 2}
, {2, 1}
, {-2, 1}
, 및 {-1, 2}
).
7 행 ConnectedComponents@a@#
에서이 인접 그래프 중 하나를 가져온 다음 연결된 구성 요소를 찾습니다. 이것은 정점의 모든 선분을 주어진 방향으로 그룹화하는 것에 해당합니다 (루크 나 감독이 하나씩 통과 할 필요가 없습니다). 그런 다음 e@t@#
6 행에서 동일한 연결된 구성 요소의 모든 정점 쌍 사이에 모서리를두고 Flatten
단일 그래프로 연결합니다. 따라서 6-8 행은 루크의 그래프 y@r
와 감독의 그래프를 정의합니다 y@b
.
마지막으로 9 ~ 11 행 {b, k, n, r}
은 두 대상 정점 사이의 최단 경로를 생성하는 요소를 선택합니다 . FindShortestPath
우리가 사용하는, 그래서 오류가 발생하고 대상 정점 (더 가장자리 그것에서 발산하지 않는 경우 일 것이다) 그래프에 표시되지 않을 경우 평가되지 않은 반환 h@__ -> 0
으로 돌아 가기0
대신 . 유효한 정점 사이의 경로가 없으면 length 목록을 반환 0
하므로 Min[z~Complement~{0}]
실제로 존재하는 가장 작은 경로의 길이를 계산하여 위의 나쁜 경우를 무시하십시오.