恢复现场1
import java.util.*;
public class Main {
static int n,m,x,y;
static int N = 15;
static int res;
static int[][] map = new int[N][N];
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};//偏移量
public static void dfs(int x,int y,int cnt) {
if (cnt == n * m) { //终止条件
res ++;
return;
}
st[x][y] = true;//标记为走过
for (int i = 0;i < 8;i ++) {
int a = x + dx[i];
int b = y + dy[i];
if (a < 0 || b < 0 || a >= n || b >= m) continue;//判断是否超出边界
if (st[a][b]) continue;//判断是否走过
dfs(a,b,cnt + 1);
}
st[x][y] = false;//恢复现场
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t -- > 0) {
n = sc.nextInt();
m = sc.nextInt();
x = sc.nextInt();
y = sc.nextInt();
res = 0;
for (int i = 0;i < n;i ++)
for (int j = 0;j < m;j ++)
st[i][j] = false;
dfs(x,y,1);
System.out.println(res);
}
}
}
恢复现场2
//二刷
import java.util.*;
public class Main {
static int n,m,x,y;
static int N = 15;
static int res;
static int[][] map = new int[N][N];
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};//偏移量
public static void dfs(int x,int y,int cnt) {
if (cnt == n * m) { //终止条件
res ++;
return;
}
for (int i = 0;i < 8;i ++) {
int a = x + dx[i];
int b = y + dy[i];
if (a < 0 || b < 0 || a >= n || b >= m) continue;//判断是否超出边界
if (st[a][b]) continue;//判断是否走过
st[a][b] = true;//标记走过
dfs(a,b,cnt + 1);
st[a][b] = false;//恢复现场
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t -- > 0) {
n = sc.nextInt();
m = sc.nextInt();
x = sc.nextInt();
y = sc.nextInt();
res = 0;
for (int i = 0;i < n;i ++)
for (int j = 0;j < m;j ++)
st[i][j] = false;
st[x][y] = true;
dfs(x,y,1);
System.out.println(res);
}
}
}