Problem - 2102 (hdu.edu.cn)https://acm.hdu.edu.cn/showproblem.php?pid=2102这个题的迷宫有两层,有一个时空传输机的概念,即从第一层的图跳转到第二层的图,所以在判断某一个点相邻的四个点是否符合条件的时候需要注意。
跳转到另一层的相对位置不能是墙壁,这是可以肯定的。
如果跳转到另一层也是一个传输机,那么按照下面这段代码来看,只是会在两个传输机之间跳来跳去。
//遇到传送机
if (arr[z][x][y] == '#') {
if (arr[1 - z][x][y] == '*') {
arr[z][x][y] = '*';
continue;
}
z = 1 - z;
}
所以必须在if条件语句里再加入一个条件,即arr[z][x][y]=='#'
AC Java代码如下
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
new Main().solve();
}
int t, m, n, T;
char[][][] arr = new char[2][11][11];
int[] fx = {1, -1, 0, 0};
int[] fy = {0, 0, -1, 1};
Comparator<Node> cNode = new Comparator<Node>() {
@Override
public int compare(Node o1, Node o2) {
return o1.time - o2.time;
}
};
private void solve() {
Scanner in = new Scanner(System.in);
T = in.nextInt();
while ((T--) != 0) {
n = in.nextInt();
m = in.nextInt();
t = in.nextInt();
for (int i = 0; i < n; i++) {
arr[0][i] = in.next().toCharArray();
}
for (int i = 0; i < n; i++) {
arr[1][i] = in.next().toCharArray();
}
if (bfs()) {
System.out.println("YES");
} else {
System.out.println("NO");
}
// printMap();
}
}
private boolean bfs() {
//将起点加入
PriorityQueue<Node> queue = new PriorityQueue<>(cNode);
queue.add(new Node(0, 0, 0, 0));
while (!queue.isEmpty()) {
Node firstNode = queue.poll();
if (arr[firstNode.z][firstNode.x][firstNode.y] == 'P')
return true;
arr[firstNode.z][firstNode.x][firstNode.y] = '*';
for (int i = 0; i < 4; i++) {
int x = firstNode.x + fx[i];
int y = firstNode.y + fy[i];
int z = firstNode.z;
int time = firstNode.time + 1;
//超出地图范围
if (x < 0 || y < 0 || x > n - 1 || y > m - 1)
continue;
//超出时间
if (time > t)
continue;
if (arr[z][x][y] == '*')
continue;
//遇到传送机
if (arr[z][x][y] == '#') {
if (arr[1 - z][x][y] == '*' || arr[1 - z][x][y] == '#') {
arr[1 - z][x][y] = '*';
arr[z][x][y] = '*';
continue;
}
z = 1 - z;
}
queue.add(new Node(x, y, z, time));
}
}
return false;
}
// private void printMap() {
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < m; j++)
// System.out.print(arr[0][i][j]);
// System.out.println();
// }
// System.out.println();
// for (int i = 0; i < n; i++) {
// for (int j = 0; j < m; j++)
// System.out.print(arr[1][i][j]);
// System.out.println();
//
// }
// }
}
class Node {
int x;
int y;
int z;
int time;
public Node(int x, int y, int z, int time) {
this.x = x;
this.y = y;
this.z = z;
this.time = time;
}
}