马在中国象棋以日字形规则移动。
请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。
输入 第一行为整数T(T < 10),表示测试数据组数。1 5 4 0 0样例输出
32【代码】
#include
#include
#include
using namespace std;
int sx[8]={1,1,-1,-1,2,2,-2,-2};
int sy[8]={2,-2,2,-2,1,-1,1,-1};
int t,n,m,x,y,ans;
bool b[20][20];
void dfs(int dep,int s,int t){
if (dep==n*m){
ans++; return;
}
for (int r=0;r<8;++r){
int x=s+sx[r]; int y=t+sy[r];
if (!b[x][y]&&x>0&&y>0&&x<=n&&y<=m){
b[x][y]=true;
dfs(dep+1,x,y);
b[x][y]=false;
}
}
}
int main(){
scanf("%d",&t);
while (t--){
scanf("%d%d",&n,&m);
scanf("%d%d",&x,&y); ++x; ++y;
memset(b,0,sizeof(b)); ans=0,b[x][y]=true;
dfs(1,x,y);
printf("%d\n",ans);
}
}