zoukankan      html  css  js  c++  java
  • [LeetCode] N-Queens

    N-Queens

    Total Accepted: 9970 Total Submissions: 38919My Submissions

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

    Solution:

    //board is 0 for avaliable positons, 1 for the other
    int board[100][100];
    int queenPos[100];
    int N;
    int solutionNum = 0;
    vector<vector<string> > result;
    
    
    void dfs(int k)
    {
        if(k == N)
        {//the last queen has been put properly
            solutionNum++;
            vector<string> cur;
            for(int i = 0;i < N;i++)
            {
                string column= "";
                for(int j = 0;j < N;j++)
                {
                    if(queenPos[i] == j)
                        column += "Q";
                    else
                        column += ".";
                }
        //        cout << column << endl;
                cur.push_back(column);
            }
        //    cout << endl << endl;
            result.push_back(cur);
            return;
        }
    
        for(int i = 0;i < N;i++)
        {
            //search for a postion for the current queen
            bool flag = true;
    
            if(board[i][k] == 0)
            {
                list<int> lastX, lastY;
                //this is a good postion for the k th column queen.
                queenPos[k] = i;//in the ith row, kth column
                //change the board state to mark its attark region.
                for(int j = 0;j < N;j++)
                {
                    if(board[i][j] == 0)
                    {
                        board[i][j] = 1;
                        lastX.push_back(i);
                        lastY.push_back(j);
                    //    cout << i << " " << j << endl;
                    }
                    if(board[j][k] == 0)
                    {
                        board[j][k] = 1;
                        lastX.push_back(j);
                        lastY.push_back(k);
                        //cout << j << " " << k << endl;
                    }
                    //
                    if(i - j >= 0 && k - j >= 0 && board[i - j][k - j] == 0)
                    {
                        //left up
                        lastX.push_back(i - j);
                        lastY.push_back(k - j);
                        board[i - j][k - j] = 1;
    
                        //cout << i -j  << " " << k - j << endl;
                    }
                    if(i - j >= 0 && k + j < N && board[i - j][k + j] == 0)
                    {
                        lastX.push_back(i - j);
                        lastY.push_back(k + j);
                        board[i - j][k + j] = 1;
                        //cout << i -j  << " " << k + j << endl;
                    }
                    if(i + j < N && k - j >= 0 && board[i + j][k - j] == 0)
                    {
                        lastX.push_back(i + j);
                        lastY.push_back(k - j);
                        board[i + j][k - j] = 1;
                    //    cout << i + j  << " " << k - j << endl;
                    }
                    if(i + j < N && k + j < N && board[i + j][k + j] == 0)
                    {
                        lastX.push_back(i + j);
                        lastY.push_back(k + j);
                        board[i + j][k + j] = 1;
                    //    cout << i + j  << " " << k + j << endl;
                    }
                }
                
                //cout << "put the " << k << " queen at " << i << " size = " << lastX.size() << endl;
    
                dfs(k + 1);
                
                //cout << "size = " << lastX.size() << endl;
                //back to the previous state.
                int num = lastX.size();
                for(int t = 0;t < num;t++)
                {
                    int x = lastX.front();
                    lastX.pop_front();
                    int y = lastY.front();
                    lastY.pop_front();
                    board[x][y] = 0;
            //        cout << x << " " << y << endl;
                }    
            }
            else
                continue;
        }
    
    }
    
    vector<vector<string> > solveNQueens(int n) {
            N = n;
        solutionNum = 0;
        for(int i = 0;i < 100;i++)
        {
            for(int j = 0;j < 100;j++)
                board[i][j] = 0;
            queenPos[i] = 0;
        }
        dfs(0);
        return result;    
        }
    View Code

  • 相关阅读:
    人名币转大写
    Http协议与TCP协议简单理解
    unity3d常用属性汇总
    ConcurrentHashMap的key value不能为null,map可以?
    一个线程池中的线程异常了,那么线程池会怎么处理这个线程?
    Dubbo负载均衡算法
    [LeetCode] 240. 搜索二维矩阵 II ☆☆☆(二分查找类似)
    [LeetCode] 74. 搜索二维矩阵 ☆☆☆(二分查找)
    Maven中的dependencyManagement 意义
    深入理解maven构建生命周期和各种plugin插件
  • 原文地址:https://www.cnblogs.com/changchengxiao/p/3825380.html
Copyright © 2011-2022 走看看