华为OD机试 2023B卷题库疯狂收录中,刷题点这里
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
同一行中如果有多个数据以一个空格隔开,用例保证所有的输入数据均合法。 (结尾不带回车换行)
陷阱方格与不可达方格数量,两个信息在一行中输出,以一个空格隔开。(结尾不带回车换行)
在我们遇到的一些问题当中,有些问题我们不能够确切的找出数学模型,即找不出一种直接求解的方法,解决这一类问题,我们一般采用搜索的方法解决。搜索就是用问题的所有可能去试探,按照一定的顺序、规则,不断去试探,直到找到问题的解,试完了也没有找到解,那就是无解,试探时一定要试探完所有的情况(实际上就是穷举);
对于问题的第一个状态,叫初始状态,要求的状态叫目标状态。
搜索就是把规则应用于实始状态,在其产生的状态中,直到得到一个目标状态为止。
产生新的状态的过程叫扩展(由一个状态,应用规则,产生新状态的过程)。
搜索的要点:
如果搜索是以接近起始状态的程序依次扩展状态的,叫宽度优先搜索。
如果扩展是首先扩展新产生的状态,则叫深度优先搜索。
深度优先搜索用一个数组存放产生的所有状态。
private static int m;// 行数
private static int n;// 列数
private static int wallNum;// 墙数
private static int[][] matrix;// 二维矩阵
/**
* 0:不可达,因为默认是0,向x和y正方向一步一步走的话,如果未涉及,就是不可达,所以是0
* -1:墙
* 1:可达
* -2:陷阱
*/
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] input = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
m = input[0];
n = input[1];
wallNum = Integer.valueOf(sc.nextLine());
matrix = new int[m][n];
matrix[m - 1][n - 1] = 1; // 可达1
for (int i = 0; i < wallNum; i++) {
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
matrix[arr[0]][arr[1]] = -1; // 墙-1,默认为0
}
dfs(0, 0);
int trapNum = 0; // 陷阱
int inaccessibleNum = 0; // 不可达
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {// 不可达
inaccessibleNum++;
}else if (matrix[i][j] == -2) {// 陷阱
trapNum++;
}
}
}
System.out.println(trapNum + " " + inaccessibleNum);
}
public static boolean dfs(int x, int y) {
if (x >= m || y >= n) {// 非法输入
return false;
}
if (matrix[x][y] == -1) {// 墙
return false;
}
if (matrix[x][y] == -2) {// 不可达
return false;
}
if (matrix[x][y] == 1) {// 可达
return true;
}
if (matrix[x][y] == 0) {
boolean step_x = dfs(x + 1, y);
boolean step_y = dfs(x, y + 1);
// 如果x或y正向都可达,则将其设为可达1
if (step_x || step_y) {
matrix[x][y] = 1;
} else {// 如果x或y正向都不可达,则将其设为陷阱-2
matrix[x][y] = -2;
}
}
return matrix[x][y] == 1;
}
6 4
5
0 2
1 2
2 2
4 1
5 1
2 3
下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。