LeetCode--N-Queens

xiaoxiao2021-02-28  115

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens’ placement, where ‘Q’ and ‘.’ both indicate a queen and an empty space respectively.

For example, There exist two distinct solutions to the 4-queens puzzle:

[ [“.Q..”, // Solution 1 “…Q”, “Q…”, “..Q.”],

[“..Q.”, // Solution 2 “Q…”, “…Q”, “.Q..”] ]

思路:回溯法。一行一行的放置并判断是否有效,递归调用解决函数,直到最后一行都检查有效时返回结果。期间若无效则回溯。判断是否有效时因为是一行一行的放置,所以行重复不用判断,只用判断之前行的列重复和两个对角线重复。

class Solution { public: vector<vector<string>> solveNQueens(int n) { vector<vector<string>>res; vector<string>nQueens(n,string(n,'.')); SolveNQueens(res,nQueens,0,n); return res; } void SolveNQueens(vector<vector<string>>&res,vector<string>&nQueens,int row,int n){ if(row==n){ res.push_back(nQueens); return; } for(int col=0;col<n;col++){ if(isValid(nQueens,row,col,n)){ nQueens[row][col]='Q'; SolveNQueens(res,nQueens,row+1,n); nQueens[row][col]='.'; } } } bool isValid(vector<string>&nQueens,int row,int col,int n){ for(int i=0;i<row;i++){ if(nQueens[i][col]=='Q') return false; } for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--){ if(nQueens[i][j]=='Q') return false; } for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++){ if(nQueens[i][j]=='Q') return false; } return true; } };
转载请注明原文地址: https://www.6miu.com/read-27379.html

最新回复(0)