🍑 算法题解专栏
🍑 saber --> 搜索 --> dfs之搜索顺序 --> 马走日
输入
1
5 4 0 0
输出
32
import java.util.*;
class Main
{
static int N = 20,n,m,ans;
static boolean[][] st = new boolean[N][N];
static int[] dx = {-2,-1,1,2,2,1,-1,-2};
static int[] dy = {1,2,2,1,-1,-2,-2,-1};
static void dfs(int x,int y,int cnt)
{
if(cnt == n*m)
{
ans++;
return;
}
// st[x][y] = true; //方案1
for (int i = 0; i < 8; i++)
{
int xx = x + dx[i];
int yy = y + dy[i];
if (xx < 0 || xx >= n || yy < 0 || yy >= m)
continue;
if (st[xx][yy])
continue;
st[xx][yy] = true; // 方案2
dfs(xx, yy, cnt + 1);
st[xx][yy] = false; // 方案2
}
// st[x][y] = false; //方案1
}
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
while(T -- > 0)
{
//多组测试数据切记初始化重复利用的全局数组
for(int i = 0; i < N; i++)
Arrays.fill(st[i],false);
n = sc.nextInt();
m = sc.nextInt();
int x = sc.nextInt();
int y = sc.nextInt();
st[x][y] = true;//标记起点(方案2)
ans = 0;//初始化答案
dfs(x,y,1);
System.out.println(ans);
}
}
}