8 皇后呢
换成经典的 8×8 棋盘。运行同样的程序: #include <cstdlib> #include <iostream> #include <string> #include <vector>
写冲突判断
补全 queen_ok:col 是前面每一行皇后所在的列,现在要在第 col.size() 行的第 c 列放一个,判断放不放得下。验两种情况:queen_ok({1}, 3) 和 queen_ok({1}, 2),两个结果拼起来输出。 (本
写 N 皇后
补全 queens_dfs:一行放一个,放之前先用 queen_ok 查一遍,放不下就跳过。输出 4 皇后的解数。 (本题用 g++ -std=c++17 -O0 编译。)
四种规模各有几个解
把 n = 4、5、6、7 各跑一遍,把四个解数拼起来输出。(这四个数不是递增的——留意 6 比 5 还少。) (本题用 g++ -std=c++17 -O0 编译。)
剪枝在 N 皇后上省了多少
写两个版本跑 n = 5:剪枝版放之前就用 queen_ok 查;不剪枝版把 5 行全铺满,最后才逐对检查。输出四样:剪枝解数 / 不剪枝解数 / 剪枝结点数 / 不剪枝结点数。 (本题用 g++ -std=c++17 -O0 编译。)
为什么不能只存 path 的地址
第 1 步:记下第 1 个:1 2 3 第 2 步:记第 2 个时,解1 也跟着变 第 3 步:三行永远一模一样 第 4 步:它们指着同一块内存 解1 解2 解3 1 2 3 3 2 1 3 2 2 1 3 2 1 3 2 1 3 用全局数
撤销要撤哪些东西(C++)
回溯的撤销要覆盖【0】。
存地址会得到什么
这个版本记解时存的是全局数组 g_path 的地址。运行它,看解的个数和第一个解的内容: #include <cstdlib> #include <iostream> #include <string>
漏了 pop_back 剩几个解
这个版本撤销时只改回了 used,忘了把 path 弹出来。运行它: #include <cstdlib> #include <iostream> #include <string> #include &
把路径记对
补全 perm_dfs:记解时存 path 的内容,撤销时 used 和 path 两样都撤。输出解的个数和第一个解。 (本题用 g++ -std=c++17 -O0 编译。)