【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 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.."]
]

说明:

  • 任意两个皇后不在同一行,不在同一列,不在同一对角线
  • 返回所有满足条件的皇后布局
  • 考虑边界条件,当n = 1的情况。

分析:

  • 同行同列的情况,我们可以使用个技巧规避掉,即定义一个数组,下标代表行,下标对应的元素值代表所在的列,初始的时候,我们将皇后放在主对角线上,即数组的每个元素初始化为其下标。这样就得到了一串数,如 4皇后的 0 1 2 3。
  • 接下来的事情就是对其进行全排列,并检查每种排列是否符合要求,即检查是否在同一对角线上,在同一对角线上,就是在同一直线上,就是斜率相同,对于方针就是斜率为+1,-1,就是 |(y1- y2) | = | x1 - x2 |。
  • 对于全排列,在问题库里有,见 permutation 。

实现:

 bool nextPermutation(vector<int> &num)
{
	int i = num.size() - 1;
	while (i >= 1)
	{
		if(num[i] > num[i - 1])
		{
			--i;
			int ii = num.size() - 1;
			while (ii > i && num[ii] <= num[i]) --ii;
			if(ii > i)
			{
				swap(num[i], num[ii]);
				reverse(num.begin() + i + 1, num.end());
				return true;
			}
		}
		else
			--i;
	}
    return false;
}

bool check(vector<int> &grids)
{
	int len = grids.size();
	for (int i = 0; i < len; ++i)
		for (int j = i + 1; j < len; ++j)
		{
			if(abs(i - j) == abs(grids[i] - grids[j]))
				return false;
		}
	return true;
}
vector<vector<string> > solveNQueens(int n) {
	vector<vector<string> > re;
	if(n < 1)
		return re;
	if(n == 1)
	    return vector<vector<string> >(1,vector<string>(1,"Q"));
	vector<int> grids(n,0);
	for (int i = 0; i < n; ++i)
	{
		grids[i] = i;
	}
	while (nextPermutation(grids))
	{
		if(check(grids))
		{
			vector<string> one_solve;
			for(int i = 0; i < n; ++i)
			{
				string line(n,'.');
				line[grids[i]] = 'Q';
				one_solve.push_back(line);
			}
			re.push_back(one_solve);
		}
	}
	return re;
}

说明:何海涛 ,回溯版本

            回溯剪枝版本

【leetcode】N-queens,布布扣,bubuko.com

时间: 2024-08-02 19:05:23

【leetcode】N-queens的相关文章

【leetcode】Generate Parentheses

题目: 给定整数n,返回n对匹配的小括号字符串数组. For example, given n = 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 分析: 这种问题的模式是:1)问题的解有多个 ,2)每个解都是由多个有效的 "步骤" 组成的,3)变更以有解的某个或某些"步骤"

【LeetCode】Implement strStr()

Implement strStr() Implement strStr(). Returns a pointer to the first occurrence of needle in haystack, or null if needle is not part of haystack. 标准KMP算法.可参考下文. http://blog.csdn.net/yaochunnian/article/details/7059486 核心思想在于求出模式串前缀与后缀中重复部分,将重复信息保存在n

【LeetCode】Add Two Numbers

You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 ->

【LeetCode】Pascal&#39;s Triangle

Pascal's Triangle Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5,Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 这题别想用通项公式做,n choose m里面的连乘必然溢出,老老实实逐层用定义做. class Solution { public: vector<vector<

【LeetCode】Copy List with Random Pointer

A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null. Return a deep copy of the list. 思路:第一遍正常复制链表,同时用哈希表保存链表中原始节点和新节点的对应关系,第二遍遍历链表的时候,再复制随机域. 这是一种典型的空间换时间的做法,n个节点,需要大小为O(n

【leetcode】Max Points on a Line (python)

给定一个点,除该点之外的其他所有点中,与该点的关系要么是共线,要么就是共点,也就是两点重合. 共线有三种情况:水平共线,垂直共线,倾斜的共线.合并下这三种情况就是斜率存在的共线和斜率不存在的共线. 那么我们的任务就是针对每个点,找出与其共线的这些情况中,共线最多的点的个数. 注意:最终的结果别忘了加上共点的个数. class Solution: def maxPoints(self, points ): if len( points ) <= 1: return len( points ) ma

【LeetCode】 Maximum Subarray

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4], the contiguous subarray [4,−1,2,1] has the largest sum = 6. More practice: If you have figu

【Leetcode】Length of Last Word

Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the length of last word in the string. If the last word does not exist, return 0. Note: A word is defined as a character sequence consists of non-space cha

【Leetcode】Path Sum II

Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example: Given the below binary tree and sum = 22, 5 / 4 8 / / 11 13 4 / \ / 7 2 5 1 return [ [5,4,11,2], [5,8,4,5] ] 思路:与[Leetcode]Path Sum 不同