网站建设 邯郸网站制作wordpress保存远程图片大小
网站建设 邯郸网站制作,wordpress保存远程图片大小,网页设计师中级证书有用吗,如何用php做电商网站C实现N皇后问题#xff08;回溯法详解OJ适配#xff09;一、核心问题分析不同行#xff1a;由于每个皇后占一行#xff0c;可简化为“逐行放置”#xff08;每行仅放一个皇后#xff09;不同列#xff1a;同一列不能有两个皇后不同对角线#xff1a;主对角线#xff0…C实现N皇后问题回溯法详解OJ适配一、核心问题分析不同行由于每个皇后占一行可简化为“逐行放置”每行仅放一个皇后不同列同一列不能有两个皇后不同对角线主对角线x-y为常数和副对角线xy为常数不能有两个皇后二、解题思路回溯法N皇后问题的核心解法是回溯法本质是“尝试-回溯-再尝试”的暴力搜索优化思路初始化n×n的空棋盘用.表示空位置逐行放置皇后第i行放置一个皇后标记其攻击范围行、列、对角线递归处理下一行重复步骤2若递归到第n行所有皇后放置完成则收集当前棋盘作为有效解回溯撤销当前皇后的放置和攻击范围标记尝试当前行的下一个列位置遍历所有可能的位置直到收集完所有有效解。关键优化用“数字字符标记不同皇后的攻击范围”确保回溯时能精准恢复棋盘状态避免不同皇后的攻击范围混淆。三、完整代码实现OJ适配版以下代码已封装为LeetCode/OJ要求的Solution类入口函数为solveNQueens(int n)可直接复制提交#include iostream #include vector #include string using namespace std; void conver(vectorvectorchar a, vectorvectorstring b) { vectorstring temp; for ( auto char_row : a) { for (char c : char_row) { if (c ! Q c ! .) { c .; } } string str(char_row.begin(), char_row.end()); temp.push_back(str); } b.push_back(temp); } void change(int x, int y, char c, vectorvectorchar a,int n) { for (int i 0; i n; i) { if (a[x][i] .) a[x][i] c; if(a[i][y].) a[i][y] c; } for (int i -(n - 1); i n - 1; i) { if (x i n x i 0 y i 0 y i na[xi][yi].) a[x i][y i] c; if (x - i n x - i 0 y i n y i 0a[x-i][yi].) a[x - i][y i] c; } } void restore(char c, int x, int y,int n,vectorvectorchara) { for (int i 0; i n; i) { for (int j 0; j n; j) { if (a[i][j] c) { a[i][j] .; } } } } void queen( int num, int n, vectorvectorchar a, vectorvectorstring b) { if (num n) { conver(a, b); return; } for (int i 0; i n; i) { if (a[num][i] .) { change(num, i, 0num, a, n); a[num][i] Q; queen(num 1, n, a, b); restore(0num, num, i, n, a); a[num][i] .; } } return; } int main() { int n 4; vectorvectorchar a(n, vectorchar(n)); vectorvectorstring b; for (int i 0; i n; i) { for (int j 0; j n; j) { a[i][j] .; } } int num 0; queen(num , n, a, b); for (const auto str_arr : b) { for (const auto str : str_arr) { cout strendl; } cout endl--------------- endl; } }四、核心代码模块解析1. 主函数int main()作用OJ的统一入口负责初始化棋盘、调用递归函数、返回最终结果。初始化n×n的棋盘a所有位置设为.空创建b存储所有有效解法二维字符串数组每个子数组是一个完整的棋盘调用核心递归函数queen从第0行num0开始放置皇后。2. 核心递归函数queen(int num, int n, vectorvectorchar a, vectorvectorstring b)作用实现回溯法的核心逻辑——逐行放置皇后、递归、回溯。终止条件num n表示已处理完第0~n-1行所有皇后放置完成调用conver转换结果并收集逐行遍历num表示当前处理的行遍历当前行的所有列i从0到n-1放置皇后若当前位置a[num][i] .空则用0 num生成当前皇后的专属标记如第0行皇后用0第1行用1调用change标记攻击范围将当前位置设为Q放置皇后递归处理下一行num1回溯调用restore恢复攻击范围标记将当前位置设回.撤销皇后。3. 攻击范围标记change(int x, int y, char c, vectorvectorchar a, int n)作用标记皇后(x,y)的攻击范围行、列、主对角线、副对角线用字符c专属标记标记避免与其他皇后混淆。标记当前行遍历第x行所有列空位置设为c标记当前列遍历第y列所有行空位置设为c标记主对角线xi, yix-y为常数需判断边界0≤nxn0≤nyn标记副对角线x-i, yixy为常数同样判断边界。4. 回溯恢复restore(char c, int x, int y, int n, vectorvectorchar a)作用撤销当前皇后的攻击范围标记——将所有标记为c的位置恢复为.确保回溯后棋盘状态正确。关键由于每个皇后的标记c是唯一的0~n-1恢复时不会影响其他皇后的标记。5. 结果转换conver(vectorvectorchar a, vectorvectorstring b)作用将标记后的棋盘转换为OJ要求的输出格式——过滤攻击范围标记0~n-1仅保留Q皇后和.空。注意参数a采用值传递避免修改原棋盘的状态不影响后续回溯。