Create a list of snaking numbers under 50,000 Snaking Number Challenge

I wonder how many snaking numbers there are between 1 and 50,000?



Snaking Numbers, in this game, are numbers which can be typed out on a traditional numberpad (format below) by moving one key up, down, left, or right.

7 8 9
4 5 6
1 2 3
 0


For example, if you start with the number 5, you could select 4, 6, 8, or 2 as your next valid move - however 7, 3, 9, and 1 are off-limits as they are positioned diagonally to the current key.
So, if you have 5, then 2, your next viable key choices are 0, 1, 3, or 5 again. 

In this Code Golf exercise, you are to output a list of all the positive snaking numbers between 1 and 50k, along with a final count of all the numbers that meet the criterion.

Rules


Numbers cannot start with a Zero.
Numbers must be whole positive integers.
Each consecutive number, read from left to right, must "snake" around the numberpad.
The snake cannot travel diagonally across keys
The number 0 can be accessed from both numbers 1 and 2
Numbers cannot be paired (eg: 22)


Examples of valid Snaking Numbers:

12369
45201
1254
10102
1
12
987


Examples of invalid numbers

1238 - 8 is not connected
0001 - multiple leading 0s
0101 - leading 0
159  - snake cannot travel diagonally
4556 - duplicate 5


As per normal Code Golfs, the aim is fewest bytes!

According to my maths and rules, you should have 670 valid snaking numbers in your list, plus 670 itself printed as the last number.
K (ngn/k), 60 57 bytes

(x;#x:{*/1=3!5&amp;+/x*x:+1_-':(+0 1,'2*!3 3)@10\x}#1+!50000)


Try it online!

!50000 list of 0 .. 49999

1+ add 1 to all

{ }# filter with the function in { }

10\x decimal digits of the argument

( )@ use as indices in ...


!3 3 a pair of lists: (0 0 0 1 1 1 2 2 2;0 1 2 0 1 2 0 1 2)
2* multiply all by 2
0 1,' prepend 0 to the first list and 1 to the second
+ transpose (pair of lists -> list of pairs). this gives us the approx button coords.


-': subtract from each pair the previous pair. use 0 0 as an imaginary element before the first.

1_ drop the first

+ transpose

x*x: square (assign to x and multiply by x). here x is a pair of lists - ∆x-s and ∆y-s

+/ sum the two lists (element by element)

5&amp; min with 5

3! mod 3

1= boolean list of where it's equal to 1

*/ product (boolean "and")

(x;#x: ) make a pair of the result and the length (#) of the result