leetcode之n皇后问题

leetcode上有两个关于n皇后的问题,两个题目基本是一样的,只是第二个是把所有的排法求出来。n皇后最简单的就是用递归,每次判断一行的一个位置,如果合法,就判断下一行,不合法再判断下一个位置

N-Queens II

Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions.

class Solution {
public:
    //由于每次都是遍历下一行,所以两个皇后的行肯定不同;由于hasUse用于判断当前列是否已经占用,所以这里之需要判断对角线的位置
    bool check(int row,int col,int n,vector<int> queue)
    {
    	int i;
    	for(i = 0; i < row;i++)
    	{
    		if(abs(i - row) == abs(queue[i]-col))return false;
    	}
    	return true;
    }
    //n表示皇后的个数
    void totalNQueens(int row,int n,vector<int>& queue,vector<bool>& hasUse,int& count)
    {
    	if(row == n)
    	{
    		count ++;
    		return;
    	}
    	int col;
    	for(col = 0;col < n;++col)
    	{
    		if(!hasUse[col] && check(row,col,n,queue))
    		{
			hasUse[col] = true;//表示第col列已经被使用
			queue[row] = col;//表示第row行选择的是第col列作为皇后
			totalNQueens(row+1,n,queue,hasUse,count);
			hasUse[col] = false;
			queue[row] = -1;
    		}
    	}
    }
    int totalNQueens(int n)
    {
    	int count = 0;
    	vector<int> queue(n,-1);
    	vector<bool> hasUse(n,false);
    	totalNQueens(0,n,queue,hasUse,count);
    	return count;
    }
};

N-Queens

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:
    bool check(int row,int col,int n,vector<int> queue)
    {
    	int i;
    	for(i = 0; i < row;i++)
    	{
    		if(abs(i - row) == abs(queue[i]-col))return false;
    	}
    	return true;
    }

    void solveNQueens(int row,int n,vector<int>& queue,vector<bool>& hasUse)
    {
    	if(row == n)//只有此处和上面不同,这里是把每一个位置保存到结果中而不是记录个数
    	{
    		vector<string> solve;
    		int i,j;
    		for(i = 0;i < row;++i)
    		{
    			string s;
    			for(j = 0;j < queue[i];++j)s += '.';
    			s += 'Q';
    			for(++j;j < n;++j) s+= '.';
    			solve.push_back(s);
    		}
    		res.push_back(solve);
    		return;
    	}
    	int col;
    	for(col = 0;col < n;++col)
    	{
    		if(!hasUse[col] && check(row,col,n,queue))
    		{
    			hasUse[col] = true;
    			queue[row] = col;
    			solveNQueens(row+1,n,queue,hasUse);
    			hasUse[col] = false;
    			queue[row] = -1;
    		}
    	}
    }
    vector<vector<string> > solveNQueens(int n)
    {
    	vector<int> queue(n,-1);
    	vector<bool> hasUse(n,false);
    	solveNQueens(0,n,queue,hasUse);
    	return res;
    }
private:
    vector<vector<string> > res;
};

leetcode之n皇后问题

时间: 2024-11-06 13:41:10

leetcode之n皇后问题的相关文章

[LeetCode系列]N皇后问题递归解法 -- 位操作方式

N皇后问题: 给定8*8棋盘, 放置n个皇后, 使其互相不能攻击(即2个皇后不能放在同一行/列/正反对角线上), 求解共有多少种放置方式? 这个问题的解答网上有不少, 但是位操作解法的我看到的不多. 下面贴出代码和图解, 也就不赘述了. 1 class Solution { 2 public: 3 /* 使用位操作实现的回溯算法. 按行扫描, 检测可以放置的列. 4 * 'limit' - 都是 '1'. 代表着所有列都被占据了 5 * 'h' - 是目前所有皇后列在行上的垂直投影. 如果 h=

[LeetCode]N-Queens 八皇后问题扩展(经典深搜)

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

[leetcode] 52. N皇后 II

52. N皇后 II 跟上个题一模一样,现在只需输出个数即可 class Solution { public int totalNQueens(int n) { boolean[] row = new boolean[n]; boolean[] h = new boolean[2 * n]; boolean[] r = new boolean[2 * n]; List<List<String>> ans = new ArrayList<>(); dfs(n, row,

[leetcode]51. N-QueensN皇后

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

leetcode| 51. N皇后问题

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回 n 皇后不同的解. 示例: 输入: 4 解释: 4 皇后问题存在如下两个不同的解法. [ ?[".Q..", ?// 解法 1 ? "...Q", ? "Q...", ? "..Q."], ?["..Q.", ?// 解法 2 ? "Q...&

Leetcode 51. N皇后

class Solution { public: //最后返回的结果 vector<vector<string>> ans; // 记录路径的信息,path的索引表示的第几列,因此对应的值就是第几行,这样才可以确定一个唯一的二维坐标 vector<int> path; // 标志记录信息 vector<bool> row; vector<bool> diagonal ; vector<bool> back_diagonal ; //

leetcode 52 N皇后问题 II

51的简化版,省去根据排列话棋盘的工作,直接计数,代码: class Solution { public: int totalNQueens(int n) { int res=0; vector<int> pos(n,-1); dfs(n,0,pos,res); return res; } void dfs(int n,int row,vector<int>& pos,int &res){ if(row==n){ res++;return; } for(int co

LeetCode:N-Queens I II(n皇后问题)

N-Queens 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 configur

LeetCode 31:递归、回溯、八皇后、全排列一篇文章全讲清楚

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天我们讲的是LeetCode的31题,这是一道非常经典的问题,经常会在面试当中遇到.在今天的文章当中除了关于题目的分析和解答之外,我们还会详细解读深度优先搜索和回溯算法,感兴趣的同学不容错过. 链接 Next Permutation 难度 Medium 描述 实现C++当中经典的库函数next permutation,即下一个排列.如果把数组当中的元素看成字典序的话,那下一个排列即是字典序比当前增加1的排列.如果已经是字典序最大的情况