LeetCode 51 N-Queens II

Follow up for N-Queens problem.

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

思路1:打表

public class Solution {
	public int totalNQueens(int n) {
		int[] result = new int[] { 0, 1, 0, 0, 2, 10, 4, 40, 92, 352, 724,
				2680, 14200, 73712, 365596, 2279184, 14772512, 95815104,
				666090624 };
		return result[n];
	}
}

思路2:使用回溯法,参照http://blog.csdn.net/mlweixiao/article/details/40984541

public class Solution {
	public static int num=0;
	private boolean isValid(List<Integer> al) {
		int column = al.get(al.size() - 1);
		for (int i = 0; i < al.size() - 1; i++) {
			if (column == al.get(i)
					|| Math.abs(column - al.get(i)) == Math.abs(al.size()-1 - i)) {
				return false;
			}
		}
		return true;
	}

	private void search(int n, List<Integer> al, int col) {
		if (col > n){
			num++;
		}else {
			for (int j = 0; j < n; j++) {
				al.add(j);
				if (isValid(al)) {
					search(n, al, col + 1);
				}
				al.remove(al.size()-1);
			}
		}
	}
	public int totalNQueens(int n) {
		num=0;
		search(n,new  LinkedList<Integer>(),1);
		return num;
	}
}

思路3 :回溯法,只不过使用位移,速度超快,参考http://blog.csdn.net/kai_wei_zhang/article/details/8033194

public class Solution {
	// sum用来记录皇后放置成功的不同布局数;upperlim用来标记所有列都已经放置好了皇后。
	static int sum = 0;
	static long upperlim = 1;

	void test(long l, long m, long n) {
		long pos;
		long p;
		if (l != upperlim) {
	        // row,ld,rd进行“或”运算,求得所有可以放置皇后的列,对应位为0,
	        // 然后再取反后“与”上全1的数,来求得当前所有可以放置皇后的位置,对应列改为1
	        // 也就是求取当前哪些列可以放置皇后
			pos = upperlim & (~(l | m | n));
			while (pos != 0) {// 0 -- 皇后没有地方可放,回溯
				 // 拷贝pos最右边为1的bit,其余bit置0
	            // 也就是取得可以放皇后的最右边的列
	            p = pos & -pos;  //相当于p = pos & (~pos + 1)                                            

	            // 将pos最右边为1的bit清零
	            // 也就是为获取下一次的最右可用列使用做准备,
	            // 程序将来会回溯到这个位置继续试探
	            pos -= p;                             

	            // row + p,将当前列置1,表示记录这次皇后放置的列。
	            // (ld + p) << 1,标记当前皇后左边相邻的列不允许下一个皇后放置。
	            // (ld + p) >> 1,标记当前皇后右边相邻的列不允许下一个皇后放置。
	            // 此处的移位操作实际上是记录对角线上的限制,只是因为问题都化归
	            // 到一行网格上来解决,所以表示为列的限制就可以了。显然,随着移位
	            // 在每次选择列之前进行,原来N×N网格中某个已放置的皇后针对其对角线
	            // 上产生的限制都被记录下来了
				test(l | p, (m | p) << 1, (n | p) >> 1);
			}
		} else
			++sum;
	}

	public int totalNQueens(int n) {
		sum=0;
		upperlim = (1 << n) - 1;
		test(0, 0, 0);
		return sum;
	}
}

时间: 2024-10-06 12:40:38

LeetCode 51 N-Queens II的相关文章

LeetCode:Spiral Matrix II - 将元素1-n^2以螺旋序填充到矩阵

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix-ii/ 3.题目内容 英文:Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. 中文:给出一个整数n,生成一个矩阵,使用数字1到n^2以螺旋顺序填充这个矩阵 例如:给出n=3,则生成如下矩阵:

leetcode——Reverse Linked List II 选择链表中部分节点逆序(AC)

Reverse a linked list from position m to n. Do it in-place and in one-pass. For example: Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note: Given m, n satisfy the following condition: 1 ≤ m ≤ n ≤ le

LeetCode——Pascal&#39;s Triangle II

Description: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. public class Solution { public List<Integer> getRow(int rowIndex) { List<List<Integer>> list = new ArrayList<List&

LeetCode --- 63. Unique Paths II

题目链接:Unique Paths II Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How many unique paths would there be? An obstacle and empty space is marked as 1 and 0 respectively in the grid. For example, There is one

LeetCode Linked List Cycle II

/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode *detectCycle(ListNode *head) { ListNode* fast = head; ListNode* slow = head;

【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 不同

Leetcode:Reverse Linked List II 反转链表区间

Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given   1->2->3->4->5->NULL,  m = 2 and n = 4, return  1->4->3->2->5->NULL. Note:Given m, n satisfy the following

【LeetCode】Spiral Matrix II

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]此题与Spiral Matrix类似,可以用相同的方法解决,相比之下,此题比前一题简单 publ

leetcode第一刷_Subsets II

要求子集,有非常现成的方法.N个数,子集的个数是2^N,每个元素都有在集合中和不在集合中两种状态,这些状态用[0,pow(2,N)]中每个数来穷举,如果这个数中的第i位为1,说明当前集合中包含源数组中的第i个数. 至于有没有重复的元素,大部分有重复元素的问题,都可以借助一个vis集合,里面存放所有已经求得的集合或者其他形式的解,只有少数题目会超时,哪些问题具体的说. class Solution { public: vector<vector<int> > subsetsWithD

leetcode - Reverse Linked List II

leetcode - Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. For example:Given 1->2->3->4->5->NULL, m = 2 and n = 4, return 1->4->3->2->5->NULL. Note:Given m, n satisfy the fol