LeetCode51 N皇后——经典dfs+回溯(三段式解法)

代码如下:

 1 class Solution {
 2 public:
 3     // record[row]  该行对应的列
 4     vector<vector<string> > ans;   // 结果集
 5     vector<vector<string>> solveNQueens(int n) {
 6         string s = "";
 7         for(int i=0; i<n; i++){
 8             s += ‘.‘;
 9         }
10         vector<int> record(n);   // 记录每行对应的列
11         vector<string> temp(n, s);   // 临时解,需要push到ans中
12         dfs(0, n, temp, record);
13         return ans;
14     }
15
16     void dfs(int row, int n, vector<string> &temp, vector<int> &record){
17         if(row == n){   // 到达最后一行,需要做处理,dfs出口
18             ans.push_back(temp);  // 已经得到最优方案,直接返回,需要push到ans数组中。
19             return;
20         }
21         for(int i=0; i<n; i++){ // 对于每一列
22             record[row] = i;
23             if(isOK(record, row)){
24                 // 下面三行回溯经典代码
25                 temp[row][i] = ‘Q‘;
26                 dfs(row+1, n, temp, record);
27                 temp[row][i] = ‘.‘;   // 进行回溯!!!
28             }
29         }
30     }
31
32     bool isOK(vector<int> &record, int row){   // 判断row行旗子是否满足要求,三个要求画个图思考一下
33         for(int i=0; i<row; i++){  // 遍历row前面的每一行,是否冲突
34             if(record[row] == record[i] || row - record[row]==i-record[i] ||
35                row+record[row]==i+record[i])    return false;
36         }
37         return true;
38     }
39 };

原文地址:https://www.cnblogs.com/conghuang/p/11833944.html

时间: 2024-11-07 13:03:46

LeetCode51 N皇后——经典dfs+回溯(三段式解法)的相关文章

蓝桥杯 算法提高 8皇后&#183;改 -- DFS 回溯

  算法提高 8皇后·改   时间限制:1.0s   内存限制:256.0MB 问题描述 规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大. 输入格式 一个8*8的棋盘. 输出格式 所能得到的最大数字和 样例输入 1 2 3 4 5 6 7 89 10 11 12 13 14 15 1617 18 19 20 21 22 23 2425 26 27 28 29 30 31 3233 34 35 36 37 38 39 4041 42 43 44 45 46 47 48

八皇后(dfs+回溯)

重看了一下刘汝佳的白板书,上次写八皇后时并不是很懂,再写一次: 方法1:逐行放置皇后,然后递归: 代码: #include <bits/stdc++.h>#define MAXN 8#define ll long longusing namespace std; ll ans=0;int c[MAXN]; void dfs(int cur){    if(cur==MAXN) ans++;   //***因为是逐行放置的,所以只要走到最后一行则肯定可行    else    {       

hduoj2553——N皇后问题,dfs回溯

hduoj 2553  dfs,回溯 N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 10297    Accepted Submission(s): 4634 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的

zstu4026——DFS+回溯——八皇后

Description 在n*n(1 <= n <= 8)的棋盘上放置n个皇后,使它们互不攻击,即任意两个皇后不允许处在同一横排.同一纵列,也不允许处在同一与棋盘边框成45o角的斜线上 Input 多组测试数据,每组输入一个整数n Output 对于每组测试数据输出1行,如果没有可能做到输出No,否则在一行中输出所有皇后的位置,输出时按第1列所在行数,第2列所在行数,...输出(行的起始坐标为1),如果有多种可能,只输出行数最小的那组(即第一列行数最小的,若第一列行数最小的有多种情况,输出第二

HDOJ2553-N皇后问题(DFS)

N皇后问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 12279    Accepted Submission(s): 5535 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于给定的N,求出

八皇后问题(回溯法&amp;枚举法)

作者 : 卿笃军 本文讨论了八皇后问题的三种解决方案: 一.枚举法 二.回溯法(递归版) 三.回溯法(非递归版) 本来这些代码是以前编写好的,没有发表,由于最近又学习到了八皇后问题,自己整理了一下发表了出来! 首先.说明一下何为八皇后问题,我也不去谷歌了,直接简单的说明一下: 八皇后问题,就是在一个8*8的平面棋盘上,要求你摆放8个棋子,要求:这8个棋子不能有2个在同一行,也不能有2个在同一列,同时一条斜线上面也不能有2个~~~~ 比如:4*4的棋盘,你可以这样摆放(4皇后问题): 以上图为参照

HDU 1016 Prime Ring Problem --- 经典DFS

思路:第一个数填1,以后每个数判断该数和前一个数想加是否为素数,是则填,然后标记,近一步递归求解. 然后记得回溯,继续判断下一个和前一个数之和为素数的数. /* HDU 1016 Prime Ring Problem --- 经典DFS */ #include <cstdio> #include <cstring> int n; bool primer[45], visit[25]; //primer打素数表,visit标记是否访问 int a[25]; //数组a存储放置的数 /

poj1321——dfs回溯

POJ 1321  DFS回溯+递归枚举 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24813   Accepted: 12261 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C. Input 输入含有多组测试数据. 每组数据的第一行

hdu4499 Cannon (DFS+回溯)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4499 Cannon Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) Total Submission(s): 363    Accepted Submission(s): 214 Problem Des