与踩方块完全一样
注意回溯
#include <iostream>
#include <memory.h>
#include <string>
#include <stdio.h>
#include <queue>
#include <math.h>
#include <stdlib.h>
using namespace std;
int T;
int sum;
int num;
int n,m,x,y;
int visited[15][15];
int dx[]={1,2,2,1,-1,-2,-2,-1};
int dy[]={2,1,-1,-2,-2,-1,1,2};
void dfs(int x,int y)
{
if( sum == n*m )
{
num++;
return ;
}
for( int i = 0; i < 8; i++ )
{
if( !visited[x + dx[i]][y + dy[i]] && (x + dx[i]) >= 1 && (y + dy[i]) >= 1 &&
(x + dx[i]) <= n && (y + dy[i]) <= m)
{
visited[x + dx[i]][y + dy[i]] = 1;
sum++;
dfs(x + dx[i], y + dy[i]);
visited[x + dx[i]][y + dy[i]] = 0;
sum--;
}
}
}
int main()
{
cin >> T;
while( T-- )
{
cin >> n >> m >> x >> y;
memset(visited, 0, sizeof(visited));
x++;
y++;
num = 0;
sum = 1;
visited[x][y] = 1;
dfs(x,y);
cout << num <<endl;
}
return 0;
}