seq() = {res = List([0, 4, 5, 9]); my(i); 
	nxtcan = Map(); 
	for(i = 0, 9, 
		mapput(nxtcan, i, nxtdigs(i));
	);
	for(i = 1, 9, 
		nxt([i]); 
	); listsort(res, 1); res

}

nxt(v) = {
	my(i, nd); 
	s = Set(v); 
	if(#s != #v, return); 
	if(s[#s] != v[1], return); 
	nd = mapget(nxtcan, v[#v]); 
	if(#setminus(Set(v[1]), mapget(nxtcan, v[#v])) == 0, 
		listput(res, fromdigits(v))
	);
		
	for(i = 1, #nd, 
		nxt(concat(v, nd[i]))
	)
	
	
	
}

nxtdigs(n) = setminus(Set(vector(3, i, (3*n+i-1)%10)), Set(n))

/*
from comment from Petros Hadjicostas
a 0 is followed by 1 or 2
a 1 is followed by 3, 4, or 5; 
a 2 is followed by 6, 7, or 8; 
a 3 is followed by 0, 1, or 9; 
a 4 is followed by 2 or 3; 
a 5 is followed by 6 or 7; 
a 6 is followed by 0, 8, or 9; 
a 7 is followed by 1, 2, or 3; 
an 8 is followed by 4, 5, or 6; 
and a 9 is followed by 7 or 8.
*/