#include <stdio.h>
#include <string.h>
int n,m,sum=0;
int a[100][100],mark[100][100];//设置标记数组b是为了保证每个点只走一次
void dfs(int i,int j)
{
if(a[i][j] || mark[i][j])
{
return ;
}
if(i==n && j==m)
{
sum++;
return ;
}
mark[i][j] = 1; //该点已经访问过了
dfs(i+1,j);
dfs(i-1,j);
dfs(i,j+1);
dfs(i,j-1);
mark[i][j] = 0; /*访问过4个方向后清零 在DFS函数最后,需要把Map[][]重新变为'0',因为递归执行的顺序是自上而下再从下向上返回
因为是多组测试数据,所以需要在递归返回时,把迷宫“恢复原貌”*/
}
int main()
{
int i,j;
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(mark,0,sizeof(mark));
for(i=0;i<=n+1;i++)
{
for(j=0;j<=m+1;j++)
{
a[i][j]=1;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
sum = 0;
dfs(1,1);
printf("%d\n",sum);
}
return 0;
}