N皇后回溯解法 leetcode N-Queens

class Solution {
public:
    vector<vector<string> > solveNQueens(int n) {
    	vector<vector<string>> xxx;
        vector<vector<int> > res;
        vector<int> com;
		int len=n;
        c3(res,com,n,len,0);
        hua(xxx,res,len);
        return xxx;
    }
private:
    void c3(vector<vector<int> > &res,vector<int> &com,int n,int len,int begin)
    {
        if(len == 0 && judge(com))
        {
			res.push_back(com);
			return ;
		}
        for(int i=0;i<n&&len>0;++i)
        {

            com.push_back(i);
            if(judge(com))          //剪枝,没有的话会超时
                c3(res,com,n,len-1,i);
            com.pop_back();

        }
    }
    bool judge(vector<int> &com)
    {
    	for(int i=0;i<com.size();i++)
    	{
    		for(int j=i+1;j<com.size();j++)
    		{
    			if(com[i] == com[j] || abs(i-j) == abs(com[i]-com[j]))
    				return false;
			}
		}
		return true;
	}
	void hua(vector<vector<string>> &str,vector<vector<int>> &com,int len)
	{
		for(auto c:com)
		{
			vector<string> ge;
			for(auto d:c)
			{
				string tem="";
				for(int i=0;i<len;++i)
				{
					if(i==d)
						tem +="Q";
					else
						tem +=".";
				}
				ge.push_back(tem);
			}
			str.push_back(ge);
		}
	}
};

  但44ms

时间: 2024-10-07 09:39:06

N皇后回溯解法 leetcode N-Queens的相关文章

[Leetcode] n queens n皇后问题

The n-queens puzzle is the problem of placing n queens on an n×nchessboard 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 t

八皇后回溯计算法研究

仔细看了下百度中的回溯法介绍,这是一种非常有用的算法,大概有两种模式,一种是遍历,一种是递归. 我把这两种方法都列出来了,按网上的说法,递归效率要比遍历快很多,我这里测试是一样的,可能是网络上那些遍历法根本没优化好吧, 多遍历了很多东西. 网上并没有Delphi的原代码,我综合了各种算法,将N阶皇后的算法一并写出来了.以下是原代码,希望有意研究的朋友跟我留言: //工程文件:Queen8.dpr,以下代码在Delphi2010下编译通过. program Queen8; uses  Forms,

20191030-带返回值的回溯算法Leetcode解数独

题目描述 编写一个程序,通过已填充的空格来解决数独问题. 一个数独的解法需遵循如下规则: 数字 1-9 在每一行只能出现一次. 数字 1-9 在每一列只能出现一次. 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次. 空白格用 '.' 表示. 一个数独. 答案被标成红色. Note: 给定的数独序列只包含数字 1-9 和字符 '.' . 你可以假设给定的数独只有唯一解. 给定数独永远是 9x9 形式的. 输入格式: [["5","3",".&

八皇后回溯递归 40行不到

个人感觉代码还算精简,比较容易混淆的一点是,board[] 数组,数组下表指的是八皇后棋盘的行,数组下标对应的值指的是八皇后棋盘的列,至于abs()可以去百度,是一个求绝对值的函数 #include <iostream> using namespace std ; #define N 8 static int sum = 0 ; const int max = N ; void print (int board []) { for(int i = 0 ;i < max ;i++) { c

79. 单词搜索-回溯算法(leetcode)

给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格.同一个单元格内的字母不允许被重复使用. 想法:本题跟我们9021 quiz7-8的类型是一样的,9024也用C写过一次,都是在二维数组里搜索,用回溯算法,今天脑袋有点不清醒,以后多刷几次. 学到的点: 1. 每一步递归中,都要注意判断 start_x,start_y的取值范围 2. 学到了python里面的语法还可以直接大于小于判断.

131. 分割回文串-回溯算法 (leetcode)

给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 代码: class Solution: def __init__(self): self.res = [] def partition(self, s: str) -> List[List[str]]: self.helper(s,[]) return self.res def helper(self,part_of_s,answerList): if not part_of_s: self.re

回溯法与八皇后问题

tail recursion 函数在调用的时候,会提前创建一个栈空间,给传递的参数也分配空间,当函数结束返回上层函数的时候,一些局部变量需要从栈中弹出并恢复到调用子函数之前的值,返回到上一个函数调用子函数之前的现场.如果是尾递归,从子函数返回的时候这个函数同时也会结束了,所以没有必要恢复一些局部变量,直接把局部变量的栈空间删除.因此一个尾递归的函数根本不需要使用栈来给子函数变量空间,可以直接使用当前变量的值为新参数的值. backtracking 八皇后问题 用一个类Queens表示棋盘上现在的

八皇后之回溯法解决[转]

问题描述: 要在8*8的国际象棋棋盘中放8个皇后,使任意两个皇后都不能互相吃掉.规则是皇后能吃掉同一行.同一列.同一对角线的棋子.如下图即是两种方案: . 解决方案: 8*8的棋盘要摆放8个皇后,且不能同行同列同对角线,那么每行必定会有一个皇后.我们可以设一个数组a用来存放每一行皇后的位置,元素值表示第几列(如a[1]=5表示第一行的皇后处于第五个格).然后只需要求出数组a的值 问题就解决了,下面介绍三种回溯解法: 1.八个for循环.用枚举的办法,八个for循环分别枚举每一行的8个位置,但是我

【一天一道LeetCode】#51. N-Queens

一天一道LeetCode系列 (一)题目 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 bo