#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<queue>
#include<map>
#include<bitset>
using namespace std;
#define F first
#define S second
typedef pair<int,int> P;
typedef pair<int,P> PP;
typedef long long ll;
int n,m,ST;
int fie[11][11];
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
vector<int> G[25][4];
int co;
int dp[25][(1<<18)];
void make_graf(){
  for(int x=0;x<m;x++){
    for(int y=0;y<n;y++){
      //      printf("fie[%d][%d]=%d\n",x,y,fie[x][y]);
      if(fie[x][y]<-1) continue;
      int no=fie[x][y];
      if(no<0) no=co;
      //          printf("%d\n",no);
      for(int i=0;i<4;i++){
	G[no][i].clear();
	for(int l=1;;l++){
	  int nx = x+dx[i]*l;
	  int ny = y+dy[i]*l;
	  if(nx<0 || ny<0) break;
	  if(nx>=m || ny>=n) break;
	  if(fie[nx][ny]>=-1)
	    G[no][i].push_back(fie[nx][ny]);
	}

	//	printf("size=%d\n",G[no][i].size());
      }
    }
  }
}
int solve(int no,int st){
  //  cout <<no << " " << bitset<24>(st) << endl;
  if(st<(1<<18)){
    if(dp[no][st]!=-1) return dp[no][st];
  }
  int x,y;
  if(st==ST){
    for(int i=0;i<4;i++){
      if(G[no][i].empty()) continue;
      for(int l=0;l<(int)G[no][i].size();l++){
	int num = G[no][i][l];
	if(num==-1) return 1;
      }
    }
    return 0;
  }
  int ret=0;
  for(int i=0;i<4;i++){
    //   cout << G[no][i].size() << endl;
    if(G[no][i].empty()) continue;
    for(int l=0;l<(int)G[no][i].size();l++){
      /*      int nx = x+dx[i]*l;
      int ny = y+dy[i]*l;
      if(nx<0 || ny<0) break;
      if(nx>=m || ny>=n) break;
      if(fie[nx][ny]==-2) continue;
      if(fie[nx][ny]==-1) continue;
      if(!(st & (1<<fie[nx][ny])) ){
	ret+=solve(nx,ny,no+1, (st | (1<<fie[nx][ny])) );
	break;
	}*/
      int num = G[no][i][l];

      //    cout << num << " " << (st|(1<<num)) << endl;
      if(num==-2) continue;
      if(num==-1) continue;
      if(!(st & (1 << num)) ){
	ret+= solve(num,(st | (1 << num)));
	break;
      }
    }
  }
  if(st<(1<<18))
    return dp[no][st]=ret;
  else
    return ret;
}

void print_fie(){
  for(int i=0;i<n;i++){
    for(int j=0;j<m;j++){
      printf("%3d ",fie[j][i]);
    }
    puts("");
  }
}

int main(){
  while(1){
    scanf("%d %d",&m,&n);
    if(!n && !m) break;
    memset(dp,-1,sizeof(dp));
    int sx,sy;
    co=0;
    for(int i=0;i<n;i++){
      for(int j=0;j<m;j++){
	scanf("%d",&fie[j][i]);
	if(fie[j][i]==1){
	  fie[j][i]=co;
	  co++;
	} else if (fie[j][i]==2){
	  fie[j][i]=-1;
	  sx=j; sy=i;
	} else if (fie[j][i]==0){
	  fie[j][i]=-2;
	}
      }
    }
    ST=(1<<co)-1;
    make_graf();
    //  print_fie();
    printf("%d\n",solve(co,0));
  }
}