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