Mathematica, 326 325 Bytes
Vielen Dank an masterX224 für den Hinweis auf eine Byte-Ersparnis!
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}]]);
Definiert eine Funktion fmit drei Argumenten: gist eine Liste von geordneten Paaren von Ganzzahlen, die die Karte darstellen, wund xgeordneten Paaren, die die Start- und Endquadrate darstellen. Die Ausgabe ist die Teilmenge von {b, k, n, r}(die jeweils Bischof, König, Ritter und Turm darstellt), die einen Pfad mit minimalen Bewegungen zwischen den beiden Feldern aufweist. Beispielsweise wird der dritte Testfall von aufgerufen f[{{0, 0}, {1, 1}, {1, 2}, {0, 3}}, {0, 0}, {0, 3}]und kehrt zurück {k}. Die letzten beiden Testfälle geben jeweils {k, n}und {}zurück.
Die Strategie besteht darin, die Quadrate der Tafel in Eckpunkte eines Graphen zu übersetzen, wobei die Kanten durch die Bewegungen der einzelnen Teile bestimmt werden, und dann integrierte Graphenroutinen zu verwenden.
Benutzerfreundlichere Version des Codes:
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 );
Select[g~Tuples~2, # - #2 & @@ # == dFindet in Zeile 3 alle geordneten Knotenpaare, deren Differenz der Vektor ist d; etransformiert dann jedes dieser geordneten Paare in eine ungerichtete Graphenkante. Dies aist eine Funktion, die Kanten zwischen allen Scheitelpunkten erstellt, die sich durch einen festen Vektor unterscheiden.
Das reicht zu definieren, in den Zeilen 4 und 5, die Königs Graph y@k(die die Vereinigung der Kanten durch die Vektoren erzeugt nimmt {1, 1}, {-1, 1}, {0, 1}, und {-1, 0}) und der Ritter des Diagramms y@n(was tut das gleiche mit {1, 2}, {2, 1}, {-2, 1}, und {-1, 2}).
Nimmt in Zeile 7 ConnectedComponents@a@#einen dieser Nachbargraphen und findet dann seine verbundenen Komponenten; Dies entspricht einer Gruppierung aller Liniensegmente von Scheitelpunkten in der angegebenen Richtung (damit ein Turm oder Läufer sie nicht einzeln durchlaufen muss). In e@t@#Zeile 6 werden dann Kanten zwischen jedes Paar von Scheitelpunkten in derselben verbundenen Komponente eingefügt, die dann Flattenzu einem einzelnen Diagramm zusammengefasst werden. Somit definieren die Linien 6 bis 8 den Turmgraphen y@rund den Bischofsgraphen y@b.
Schließlich wählen die Linien 9 bis 11 die Elemente aus {b, k, n, r}, die den kürzesten Weg zwischen den beiden Zielscheitelpunkten ergeben. FindShortestPathwird einen Fehler auslösen und unbewertet zurückgeben, wenn ein Zielscheitelpunkt nicht im Diagramm angezeigt wird (was passiert, wenn keine Kanten von ihm ausgehen). In diesen Fällen verwenden wir stattdessen die h@__ -> 0Rückgabe 0. Und das Fehlen eines Pfads zwischen gültigen Scheitelpunkten gibt eine Liste mit Längenangaben zurück 0. Min[z~Complement~{0}]Berechnet daher die Länge des kleinsten Pfads, der tatsächlich existiert, und ignoriert dabei die oben genannten fehlerhaften Fälle.