陷阱方格
2025-11-02 本文已影响0人
何以解君愁
房间由XY的方格组成,例如下图为64的大小。每一个方格以坐标(x, y)描述。
机器人固定从方格(0, 0)出发,只能向东或者向北前进。
出口固定为房间的最东北角,如下图的方格(5, 3)。用例保证机器人可以从入口走到出口。
房间有些方格是墙壁,如(4,1),机器人不能经过那儿。
有些地方是一旦到达就无法走到出口的,如标记为B的方格,称之为陷阱方格。
有些地方是机器人无法到达的,如标记为A的方格,称之为不可达方格,不可达方格不包括墙壁所在的位置。
输入描述:
第一行为房间的X和Y (0 < X,Y <= 1000)
第二行为房间中墙壁的个数N (0 <= N < X*Y)
接着下面会有N行墙壁的坐标
输出描述:陷阱方格与不可达方格数量,两个信息在一行中输出,以一个空格隔开。(结尾不带回车换行)
//思路,先计算第一次遍历过去的情况,把所有能达到的地方记录,总的减去这些减去障碍物就是不可达;
//第二次从最终点往回,记录所有第一次有记录的数,然后第一次的减去第二次的就是陷阱
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
// x y
int x = sc.nextInt();
int y = sc.nextInt();
//障碍数量
int n = sc.nextInt();
//网格
int[][] xy = new int[x][y];
for(int i = 0;i < n;i++){
int xTemp = sc.nextInt();
int yTemp = sc.nextInt();
if(xTemp >= 0&&xTemp < x&&yTemp >= 0&&yTemp < y){
xy[xTemp][yTemp] = 1;
}
//好像没非法处理
}
//统计能走到的空白块
int white = 0;
white += dfs(xy,x,y,0,0);
//总的减去它和障碍数量就是不可达
int res1 = x*y - white - n;
//反向统计上一次的能走的的能到达区域,不能到就是陷阱
int white1 = 0;
white1 += dfs1(xy,x,y,x-1,y-1);
int res2 = white - white1;
System.out.print(res2 + " " + res1);
}
public static int dfs(int[][] xy,int x,int y,int i,int j){
if(i < 0||j < 0||i >= x||j >= y||xy[i][j] == 1||xy[i][j] == 2){
return 0;
}
//遍历后标记2,方便统计陷阱
xy[i][j] = 2;
int area = 1;
area += dfs(xy,x,y,i + 1,j);
area += dfs(xy,x,y,i,j + 1);
return area;
}
public static int dfs1(int[][] xy,int x,int y,int i,int j){
if(i < 0||j < 0||i >= x||j >= y||xy[i][j] == 1||xy[i][j] == 0){
return 0;
}
//遍历后标记2改为0,方便遍历
xy[i][j] = 0;
int area = 1;
area += dfs1(xy,x,y,i - 1,j);
area += dfs1(xy,x,y,i,j - 1);
return area;
}
}