#include <stdio.h>
#include <string.h>
#include <time.h>
int flag[11][11],n,m,x,y,nm,sum;
int ro[8]= {1,2,2,1,-1,-2,-2,-1}, //8个方向上的x,y增量
co[8]= {-2,-1,1,2,2,1,-1,-2};
int f(int g,int a,int b) {
int i;
if(g==nm) sum++; //当nm恰好等于g时,说明马恰好每个格子都走过了。并且没有重复走。此时ans++,如果没有相等,就继续模拟
else{
for(i=0;i<8;i++) { //遍历8个方向
int xx=a+ro[i],yy=b+co[i]; //走此方向,得到的新坐标
if(xx>=0&&xx<n&&yy>=0&&yy<m&&(!flag[xx][yy])){
flag[xx][yy]=1;
f(g+1,xx,yy);
flag[xx][yy]=0; //回溯:递归返回,
}
}
}
}
int main(){
int t;
clock_t go,end; //定义与clock()计时函数相关的数据类型是clock_t
double s;
scanf("%d",&t);
while(t--){
sum=0; //因为每一次输入的数据都是在上一次的结果上修改的
memset(flag,0,sizeof(flag)); //所以应该将其清除
scanf("%d%d%d%d",&n,&m,&x,&y);
nm=n*m; //棋盘格子数
flag[x][y]=1; //将马的初始位置赋值为1
go=clock(); //开始计时,确定递归函数所用时间
f(1,x,y);
end=clock(); //停止计时,
s=(double)(end-go)/CLOCKS_PER_SEC; //处理整个函数所用时间,并且以秒s为单位
printf("sum=%d time=%lfs\n",sum,s);
}
return 0;
}