
This problem can be solved by a simple exhaustive search. The number of paths is less than 25*45 = 25600 (25 starting points, and up to 4 directions for each hop). The recursive function takes a recursion depth, current position and the number so far, then recurses in each valid direction. [See the solution to 'passwd' for a more in-depth discussion of recursion.]
Somehow the distinct numbers must be counted. One option is a boolean array of 1000000 elements, initialised to false and set to true when a particular element is encountered. Another is to use a C++ or Java set to hold the elements.
Here is topcoder champ Tomek Czajk'a solution:
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <set>
#include <sstream>
using namespace std;
#define REP(i,n) for(int _n=n, i=0;i<_n;++i)
#define FOR(i,a,b) for(int i=(a),_b=(b);i<=_b;++i)
#define FORD(i,a,b) for(int i=(a),_b=(b);i>=_b;--i)
typedef long long LL;
const int INF = 1000000000; const LL INFLL = LL(INF) * LL(INF);
template<class T> inline int size(const T&c) { return c.size(); }
///////////////////////////////////////////////////////////////////
int tab[5][5];
set<int> seen;
void go(int x,int y,int nr, int v) {
v = 10*v + tab[x][y];
++nr;
if(nr==6) { seen.insert(v); return; }
if(x>0) go(x-1,y,nr,v);
if(x<4) go(x+1,y,nr,v);
if(y>0) go(x,y-1,nr,v);
if(y<4) go(x,y+1,nr,v);
}
int main() {
FILE *f = fopen("numgrid.in","r");
REP(y,5) REP(x,5) fscanf(f,"%d",&tab[x][y]);
fclose(f);
REP(x,5) REP(y,5) go(x,y,0,0);
int res = size(seen);
f = fopen("numgrid.out","w");
fprintf(f,"%d\n",res);
fclose(f);
}