长春建筑公司有哪些公司西安企业seo外包服务公司
长春建筑公司有哪些公司,西安企业seo外包服务公司,福州企业网站维护价格低,企业网站的设计与实现52. N 皇后 II
52. N皇后Ⅱ
我以前写这题的时候就没搞明白#xff0c;她是怎么计算两边的对角线的#xff0c;然后我今天自己推了一下#xff0c;但是我是横竖进行遍历#xff0c;传的参数是放了几个皇后#xff0c;导致不仅时间复杂度很高#xff0c;而且还可能导致一…52. N 皇后 II52. N皇后Ⅱ我以前写这题的时候就没搞明白她是怎么计算两边的对角线的然后我今天自己推了一下但是我是横竖进行遍历传的参数是放了几个皇后导致不仅时间复杂度很高而且还可能导致一行里面有多个皇后还导致搜索空间爆炸所以应该采用dfs传入行数这一个参数然后遍历每列的每一个N 皇后问题有一个隐含但必须遵守的约束✅每行只能放一个皇后void dfs(int x, int y, int t) { for (int i x; i w; i) { for (int j y; j w; j) { // 尝试在 (i,j) 放皇后 } } }会导致同一行可能放多个皇后比如先在(0,0)放一个回溯后又在(0,1)放一个 → 违反规则大量重复解皇后顺序不同但位置相同如先放 (0,0) 再放 (1,1)或先放 (1,1) 再放 (0,0)会被算作两个解搜索空间爆炸你是在所有格子中“任意选 k 个不冲突的位置”而不是“每行选一个”✅ 正确策略按行递归每行只放一个皇后标准做法是第t层 DFS 处理第t行在该行尝试每一列j这样天然保证每行一个皇后且不会重复计数题目题解class Solution { int w; //竖 boolean[] col; //左对角线——xy boolean[] left; //右对角线——w-1y-x boolean[] right; int res; //以行数为参数 void dfs(int row) { if(roww) { res; return; } for(int j0;jw;j) { if(col[j]falseleft[rowj]falseright[w-1j-row]false) { //放皇后 col[j]true; left[rowj]true; right[w-1j-row]true; dfs(row1); //恢复现场 col[j]false; left[rowj]false; right[w-1j-row]false; } } } public int totalNQueens(int n) { w n; col new boolean[n]; left new boolean[2*n]; right new boolean[2*n]; res 0; dfs(0); return res; } }