Najkrótsza ścieżka dla rycerza szachowego


12

Twój program powinien obliczyć liczbę ruchów, które rycerz szachowy musi osiągnąć, aby dotrzeć do każdego pola szachownicy. Dane wejściowe będą dwiema liczbami całkowitymi oddzielonymi spacją reprezentującymi współrzędne początkowego kwadratu (współrzędna pozioma, a następnie pionowa, każda 0-7 włącznie). Twój program powinien wypisać siatkę liczb zawierającą minimalną liczbę ruchów, które rycerz szachowy musi wykonać, aby dotrzeć do każdego kwadratu.

przykłady

Wejście

0 0

wynik

03232345
34123434
21432345
32323434
23234345
34343454
43434545
54545456

Wejście

3 1

wynik

21232123
32303232
21232123
34121432
23232323
32323234
43434343
34343434

Najkrótszy kod wygrywa.

Odpowiedzi:


4

Ruby 1.9, 146 151 znaków

g=(?9*8+".
")*8
r=->x,a=0{x<0||a<g[x].to_i&&(g[x]=a.to_s;[21,19,12,8].map{|i|r[x+i,a+1];r[x-i,a+1]})}
r[eval gets.split*?++"*10"]
puts g.tr(?.,"")

4

Haskell , 255 236 231 229 bajtów

import Data.List
k x y=unlines[[toEnum$findIndices(elem(i,j))(scanl(\s _->filter(\(z,w)->z`elem`n&&w`elem`n)$(\(a,b)->[(a+c,b+d)|(c,d)<-zip[1,1,-1,-1,-2,-2,2,2][2,-2,2,-2,1,-1,1,-1]])=<<s)[(x,y)]n)!!0+48|j<-n]|i<-n]where n=[0..7]

RE:

To moja pierwsza próba gry w golfa. Również nieco nowy w Haskell.

Zestaw testowy:

import System.Environment

main :: IO ()
main = do
    args <- getArgs
    let readArgs = map read args
    let out = k (readArgs !! 0) (readArgs !! 1)
    putStr out

2
Witamy na stronie! Dobry pierwszy golf. Jeśli potrzebujesz dodatkowych pomysłów na grę w
isaacg

map(\(c,d)->...)$zip ...można skrócić do zipWith(\c d->...)....
Laikoni

2

Windows PowerShell, 178 183 188

filter f($n){if($d[($p=$_)]-gt$n){$d[$p]=$n
12,8,21,19|%{$p+$_
$p-$_}|f($n+1)}}$d=,0*20+(0..7|%{,9*8+0,0})+,0*20
$x,$y=-split$input
20+"$y$x"|f 0
2..9|%{-join$d[(10*$_).."$_`7"]}

Przechodzi oba przypadki testowe.


1

JavaScript, 426 408 bajtów

for(a=[],i=0;i<8;i++){a[i]=[];for(j=0;j<8;j++)a[i][j]=99}m=[[2,1],[2,-1],
[-2,1],[-2,-1],[1,2],[-1,2],[1,-2],[-1,-2]];function s(f,g,e,b){b&&(a[f][g]=0);
for(var b=[],c=0;c<m.length;c++){var d=[f+m[c][0],g+m[c][1]];a[d[0]]&&
a[d[0]][d[1]]&&a[d[0]][d[1]]>e&&(a[d[0]][d[1]]=e,b.push(d))}for(c=0;c<b.length;c++)
s(b[c][0],b[c][1],e+1)}function _(f,g){s(g,f,1,1);for(e="",b=0;b<8;b++)e+=
a[b].join("")+"\n";return e}

JavaScript nie jest najbardziej zwięzłym językiem na świecie ... Ale mój styl kodowania jest również trochę zbyt szczegółowy.

Zastosowanie: _(0, 0)itp.


Wyjmij wszystkie te vari zaoszczędź sobie mnóstwo miejsca ...
Ry-

@minitech: Jest to funkcja rekurencyjna, więc wszystko popsuje ... Niektóre varjednak można usunąć, dzięki.
pimvdb
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.