​​题目连接​​

拿来练dfs了。细节较多。debug较多。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
import java.util.Vector;

public class Main {
static int n, m, x1, x2, y1, y2;
static boolean vis[][] = new boolean[1005][1005];
static int mp[][] = new int[1005][1005];
static int flag;
static void dfs(int x, int y, int turn, int dis) {
if(flag == 1) {
vis[x][y] = false;
return ;
}
// System.out.println(x + " " + y + " " + turn + " " + dis + " " + vis[x][y]);
if(mp[x][y] != 0 || turn > 2 || x <= 0 || x > n || y <= 0 || y > m || vis[x][y])
{
return ;
}
if(x == x2 && y == y2) {
flag = 1;
vis[x][y] = false;
// System.out.println(1111111);
return ;
}
vis[x][y] = true;
if(x == x1 && y == y1) {
dfs(x, y + 1, turn, 1);
dfs(x + 1, y, turn, 2);
dfs(x, y - 1, turn, 3);
dfs(x - 1, y, turn, 4);
}
if(dis == 1) {
dfs(x, y + 1, turn, 1);
dfs(x + 1, y, turn + 1, 2);
dfs(x, y - 1, turn + 1, 3);
dfs(x - 1, y, turn + 1, 4);
}
if(dis == 2) {
dfs(x + 1, y, turn, 2);
dfs(x, y + 1, turn + 1, 1);
dfs(x, y - 1, turn + 1, 3);
dfs(x - 1, y, turn + 1, 4);
}
if(dis == 3) {
dfs(x, y - 1, turn, 3);
dfs(x, y + 1, turn + 1, 1);
dfs(x + 1, y, turn + 1, 2);
dfs(x - 1, y, turn + 1, 4);
}
if(dis == 4) {
dfs(x - 1, y, turn, 4);
dfs(x, y + 1, turn + 1, 1);
dfs(x + 1, y, turn + 1, 2);
dfs(x, y - 1, turn + 1, 3);
}
vis[x][y] = false;
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while(true) {
n = cin.nextInt();
m = cin.nextInt();
if(n == 0 && m == 0)break;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= m;j++) {
mp[i][j] = cin.nextInt();
vis[i][j] = false;
}
int q = cin.nextInt();
for(int i = 0; i < q;i++) {
x1 = cin.nextInt();
y1 = cin.nextInt();
x2 = cin.nextInt();
y2 = cin.nextInt();
flag = 0;
if(mp[x1][y1] == mp[x2][y2] && mp[x2][y2] != 0) {
int t1 = mp[x1][y1];
int t2 = mp[x2][y2];
mp[x1][y1] = 0;
mp[x2][y2] = 0;
dfs(x1, y1, 0, 1);
mp[x1][y1] = t1;
mp[x2][y2] = t2;
if(flag == 1)System.out.println("YES");
else System.out.println("NO");
}else System.out.println("NO");
}
}

}
}