Clingo, 5.3 hours202 seconds for 20×20
#script (python) import clingo import itertools import sys def main(prg): matrix = [list(line.split()) for line in sys.stdin] def data(): for i, row in enumerate(matrix): for j, cell in enumerate(row): if cell == '0': yield f'cell(({i}, {j})).\n' def on_model(model): step = {} for atom in prg.symbolic_atoms: if atom.symbol.name == 'step' and model.contains(atom.symbol): a, d, b = atom.symbol.arguments step[a] = d, b moves = [] a = clingo.Tuple((0, 0)) while astep[a][1] in!= stepclingo.Tuple((0, 0)): d, a = step[a] moves.append(d) print(len(moves) + 1) print(','.join(f'{d} {len(list(g))}' for d, g in itertools.groupby(moves))) prg.add('data', [], ''.join(data())) prg.ground([('base', []), ('data', [])]) prg.solve(on_model=on_model) #end. #program base. dir(s, (1, 0); e, (0, 1); n, (-1, 0); w, (0, -1)). adj((X, Y), D, (X+DX, Y+DY)) :- cell((X, Y)), dir(D, (DX, DY)), cell((X+DX, Y+DY)). adj(A, end, (0, 0)) :- cell(A). {step(A, D, B) : adj(A, D, B)} <== 1 :- visit(A). :- cellvisit(B), {step(A, D, B) : adj(A, D, B)} >=!= 21. visit((0, 0)). visit(B) :- step(A, D, B). :~ visit(A). [-1, A] #show step/3.
$ clingo -q longest.lp < 20x20.in clingo version 5.2.2 Reading from longest.lp Solving... 1 2 s 1 3 es 2 4 es 3 5 e 3,s 1 6 e 3,s 2 7 e 3,s 3 9 e 3,s 85 … 263264 s 4,e 1,wn 4,e 2,s 1,nw 1,s 1,e 1,s 1,nw 1,s 1,e 1,s 1,nw 31,s 1,ew 1,sn 1,nw 1,s 13,e 21,sn 111,e 1,ws 12,ne 1,wn 113,e 32,s 1,e 2,sn 17,e 21,ws 2,e 2,wn 1,ew 1,wn 1,ne 24,s 15,nw 1,ws 1,ne 1,s 2,n 1,w 42,es 1,we 12,ns 1,w 1,s 1,e 41,s 1,nw 2,s 2,e 1,w 1,e 1,s 12,ew 1,wn 3,e 1,s 6,n 1,se 1,en 1,sw 1,n 23,we 1,n 1,sw 41,en 1,we 2,en 23,sw 1,ns 12,w 3,s 1,e 1,s 1,n 4,w 1,ns 1,we 1,es 14,w 1,n 2,w 1,s 3,e 1,s 1,nw 1,s 1,e 1,s 1,nw 1,s 1,e 13,s 1,ne 1,sn 23,e 1,wn 1,e 1,s 2,w 1,s 1,e 41,s 1,w 1,ns 32,w 1,n 1,w 2,en 1,w 2,s 1,e 1,s 1,e 1,w 2,n 1,ws 1,ne 2,wn 1,e 31,s 1,e 13,sn 32,e 2,wn 1,e 2,s 13,e 1,w 2,n 1,w 3,e 1,w 1,n 16,w 31,en 1,we 1,n 19,w 1,en 1,we 1,n 1,w 12,s 3,e 1,ws 1,nw 1,ws 1,e 1,ws 1,nw 1,ws 1,e 21,s 91,nw 1,s 1,e 1,s 31,nw 1,s 13,e 1,s 51,nw 1,ws 1,ne 1,s 12 265 e 3,s 24,we 1,n 4,e 2,s 1,w 21,s 1,e 1,s 1,w 1,s 1,e 1,s 1,w 1,s 31,ew 21,sn 111,ew 1,ns 123,we 21,n 1,e 1,ns 312,e 1,sn 313,e 2,s 1,e 2,sn 37,e 1,ns 2,e 12,n 21,w 21,n 1,e 24,ns 5,w 1,s 1,e 1,s 1,w 2,ns 41,e 62,s 1,w 1,s 1,e 1,s 111,w 12,ns 61,w 1,ns 12,ew 1,n 13,we 1,n 1,e 1,n 1,w 1,n 23,we 1,sn 1,w 1,n 1,e 2,n 3,w 1,s 2,ew 23,s 51,e 1,s 1,w 21,s 1,e 21,s 34,w 1,n 2,w 1,s 3,e 21,s 21,w 1,ns 1,we 21,ns 41,w 1,s 61,e 3,s 1,e 1,n 3,e 1,n 1,e 1,s 2,w 21,s 1,e 31,ns 21,ew 1,s 2,ew 1,n 1,w 2,n 1,w 2,s 1,e 1,s 1,w 1,s 1,e 2,n 41,e 1,s 1,e 3,n 2,e 2,n 1,e 2,s 21,e 1,ns 31,w 1,s 1,e 2,n 3,ew 1,n 1,w 1,n 31,e 1,n 1,w 1,n 1,e 1,n 1,w 1,n 1,e 1,n 1,w 1,n 1,e 1,n 1,w 1,n 1,e 21,sn 91,w 1,sn 1,e 1,sn 31,w 1,sn 1,e 1,sn 51,w 1,n 1,e 2,s 15 OPTIMUM FOUND Models : 25999 Optimum : yes Optimization : -265 Calls : 1 Time : 18918201.643s664s (Solving: 18918201.54s56s 1st Model: 0.00s Unsat: 0.00s) CPU Time : 18867201.092s602s
•─────┐• ┌───┐ 1 0 1 ┌───────────┐┌─┐ ┌───────┐ 1 0 1 ┌───┐ ┌───┐│ │ ┌─┘ 1 0 1 │ ┌─┐│ └─┐ ┌─┐ ┌─┘│ 1 0 1 └─┐ │ └─┐│ └─┘│ └─┐ 1 0 1 │ │└───┘ └─┘│ │ └─┐│ 1 0 1 ┌─┘ │ ┌─┘│ ┌─┐│ ┌─┘ 1 0 1 │ └───┐┌─────┘ └─┐│ │ 1 0 1 └─┐ │ └─┐ │└─┘ │└─┐ 1 0 1 └───┐ │ ┌─┘└─┐ ┌───┘ │ 1 0 1 ┌─┘ │ ┌─┘ │┌─┐ │┌─┘ 1 0 1 ┌───┘ │ ┌─┘ └─┐ │┌─┘ 1 0 1 └─┐ │ │ ┌─┘└─┘ └───┐┌───┐ 1 └───┐ │ └─┐ ┌─┘ │└─┐ 1 0 1 ┌─┘ │ │ └───┐┌─┐ │ 1 └───┐└───┘ 1 │ │ └─┐ │┌───┘ 1 0 1 └─┐ │ └───┐└─┘ │ │ 1 0 1 │ ┌─┘ └─┐┌─┐ │ │ └───┐ 1 0 1 ┌─┘ │ 0 1 │ │ 1 1 1 │ │ ┌───┘ │ │└─┐ ┌─┘ 1 0 1 │└─┐ ┌─┘│ 0 1 │ │ 1 1 1 └─┘│ └───┐└─┘ │┌─┘ │└─┐ 1 0 1 │┌─┘ └─┐│ 0 1 │ │ 1 1 1 ┌─┐ ┌─┐ │└─┐ │┌─┘ │┌───┘ 1 0 1 └─┐ │ 0 1 │ │ 1 1 1 │ │ │ │┌─┘ │ │┌─┘ │┌─┐ 1 0 1 ┌─┘ │ 0 1 │ │ 1 1 1 │└─┐ │ │ └─┘┌─┘ └─┘│ 1 0 1 │└─┐ ┌─┘│ 0 1 │ │ 1 1 1 │┌─┘ │└─┘ └───┐│ ┌─┐┌─┘ 1 0 1 │┌─┘ └─┐│ 0 1 │ │ 1 1 1 │ └───┐ │└─────┐ │ │└─┐ 1 0 1 └─┐ │• 0 1 │ │ 1 1 1 │ ┌─┐┌───┐ └─┘ │ │┌─┘ 1 ┌───┐ │ │└─┐ 0 1 │ │ 1 1 1 └─┘ │└─┐ ┌─┐└───┐ │ └───┘┌───┘ 1 │ │└─┐ │ 0 1 │ │ 1 1 1 ┌───┘┌─┘ │┌─┐ │└─┘ └─┐│ 1 0 1 └─┘┌─┘ │ 0 1 └─┘ 1 1 1 └─────┘ └───┘ └─────┘ 1 0 1 •───┘└───┘