Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
377503 许安哲 传教士 Java 解答错误 11 470 MS 16200 KB 1914 2026-02-01 10:24:05

Tests(1/9):


import java.util.Scanner; // 主类名Main,在线测评强制要求 public class Main { // 全局变量:最大数量、网格实际行/列(修正后)、列数(每行可放的数量) private static int maxNum = 0; private static int rows; // 实际行数 = 题目输入的m(垂直区域数) private static int cols; // 实际列数 = 题目输入的n(水平区域数) public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); // 题目输入:水平区域数(列数cols) int m = sc.nextInt(); // 题目输入:垂直区域数(行数rows) sc.close(); cols = n; rows = m; // DFS:从第0行开始,上一行是否放置(false=未放),当前已放置总数0 dfs(0, false, 0); // 输出正确最大值 System.out.println(maxNum); } /** * DFS核心:逐行判断,每行仅放满/不放两种选择,放的行不能相邻 * @param curRow 当前处理的行 * @param prePut 上一行是否放置了传教士(true=放了,false=没放) * @param curSum 当前已放置的总数 */ private static void dfs(int curRow, boolean prePut, int curSum) { // 递归终止:遍历完所有行,更新最大值 if (curRow >= rows) { if (curSum > maxNum) { maxNum = curSum; } return; } // 选择1:当前行不放,直接处理下一行,上一行状态为false dfs(curRow + 1, false, curSum); // 选择2:当前行放满 → 前提是上一行没放(无冲突) if (!prePut) { // 放满当前行:数量+cols,下一行的上一行状态为true dfs(curRow + 1, true, curSum + cols); } } }


测评信息: