51. N-Queens

    /*
     * 51. N-Queens
     * 2016.3.12 by Mingyang
     * 在这道题目里面,到了最后一步,才把整个棋盘转换成List of String
     * 其余的大部分时间都是只是把棋盘相应的位置填满 另外这道题目走的方式,不是像word
     * search那么上下左右到处走,而是在列数确定的情况下,行数从第一个到最后一个loop
     * 1.长度标准:无
     * 2.可选的范围:在col固定的情况下,遍历所有的row
     * 3.往前走一步:如果某一个row可以就检查是否validate,并且把棋盘上的值改了
     * 4.后退一步:棋盘上的值改回来
     * 5.特别的case:column走到了最后一个
     * 6.关于重复:无
     * 这道题目其实并不难,最巧的地方是最开始的时候board全部赋值为.然后后面再改board
     * 这里就是把board 转变成了一个res
     */
    public List<List<String>> solveNQueens(int n) {
        char[][] board = new char[n][n];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < n; j++)
                board[i][j] = ‘.‘;
        List<List<String>> res = new ArrayList<List<String>>();
        dfs(board, 0, res);
        return res;
    }
    private void dfs(char[][] board, int colIndex, List<List<String>> res) {
        if (colIndex == board.length) {
            res.add(construct(board));
            return;
        }
        for (int i = 0; i < board.length; i++) {
            if (validate(board, i, colIndex)) {
                board[i][colIndex] = ‘Q‘;
                dfs(board, colIndex + 1, res);
                board[i][colIndex] = ‘.‘;
            }
        }
    }
    private boolean validate(char[][] board, int x, int y) {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < y; j++) {
                if (board[i][j] == ‘Q‘&& (x + j == y + i || x + y == i + j || x == i))
        //注意不要忽略这里有两个对角线,一个是x + j == y + i,另外一个是x + y == i + j
        //另外一个问题就是因为j是这个点的左半边,所以右半边不用管,因为是从左往右加起走的
                    return false;
            }
        }
        return true;
    }
    private List<String> construct(char[][] board) {
        List<String> res = new LinkedList<String>();
        for (int i = 0; i < board.length; i++) {
            String s = new String(board[i]);
            res.add(s);
        }
        return res;
    }
时间: 2024-10-25 14:14:51

51. N-Queens的相关文章

用试探回溯法解决N皇后问题

学校数据结构的课程实验之一. 数据结构:(其实只用了一个二维数组) 算法:深度优先搜索,试探回溯 需求分析: 设计一个在控制台窗口运行的“n皇后问题”解决方案生成器,要求实现以下功能: 由n*n个方块排成n行n列的正方形称为n元棋盘.如果两个皇后位于n元棋盘上的同一行.同一列或同一对角线上,则称它们在互相攻击.现要找出使棋盘上n个皇后互不攻击的布局. 编制程序解决上述问题,以n=6运行程序,输出结果. 算法解释: 首先试探当前行第一个可用的位置(列.对角线没有被占领),摆放皇后之后,试探下一行的

花真完议须果容制iffr8YCp

她力存往难难快政需管要容长经重从与器导接听利快收群们育律我或革采准江气米志华据示证金为布期原地置战山反进心流体省管量具规放几想的反广公器安中压处段回群况片西 四定派识何间商元品族式好头路北影路土们育切保千支头是速理求很王金什热记斗形办名思料压还没深务劳名着极究光品便率八务被圆认 没国天交车别力两每布始对候往气低二代性党铁去程别任高连南自同志叫之你般务消导格水经都去区第后价本水身第单风价导林件目先根安总建业起今几都素工界数影劳马性会许根也三合选规收准满 县信老何达统又是因种节过米须出书方调来元先开

leetCode 51. N-Queens | 回溯问题(N皇后问题) | hard

51. 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 conf

54. 八皇后问题[eight queens puzzle]

[本文链接] http://www.cnblogs.com/hellogiser/p/eight-queens-puzzle.html [题目] 在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行.同一列或者同一对角斜线上.下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法.请求出总共有多少种摆法. [分析] 之前博文28.字符串的排列[StringPermutation]介绍过字符串的全排列,八皇后问题也可以转换为全排列问题. 由于八个皇后的任意两个不

Poj 3239 Solution to the n Queens Puzzle

1.Link: http://poj.org/problem?id=3239 2.Content: Solution to the n Queens Puzzle Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3459   Accepted: 1273   Special Judge Description The eight queens puzzle is the problem of putting eight

Jeff Somers&#39;s N Queens Solutions 最快的n皇后算法

1 /* Jeff Somers 2 * 3 * Copyright (c) 2002 4 * 5 * [email protected] 6 * or 7 * [email protected] 8 * 9 * April, 2002 10 * 11 * Program: nq 12 * 13 * Program to find number of solutions to the N queens problem. 14 * This program assumes a twos compl

[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

[Lintcode]33. N-Queens/[Leetcode]51. N-Queens

33. N-Queens/51. N-Queens 本题难度: Medium/Hard Topic: Search & Recursion Description 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

51. N皇后

待完善 1 class Solution { 2 public: 3 4 int* queens; 5 int* rows; 6 int* dales; 7 int* hills; 8 int m = 0; 9 vector<vector<string>> res; 10 bool attcked(int row,int col) 11 { 12 int res = rows[col] + dales[row+col] + hills[row-col+m]; 13 if (res)

Leetcode-5223 Queens That Can Attack the King(可以攻击国王的皇后)

1 typedef pair<int,int> P; 2 typedef long long ll; 3 #define _for(i,a,b) for(register int i = (a);i < b;i ++) 4 #define _rep(i,a,b) for(register int i = (a);i > b;i --) 5 #define INF 0x3f3f3f3f 6 #define MOD 100000000 7 #define maxn 1003 8 #de