Skip to content

Latest commit

 

History

History
122 lines (121 loc) · 2.64 KB

N-Queens II.md

File metadata and controls

122 lines (121 loc) · 2.64 KB

#N-Queens II ##Problem: Follow up for N-Queens problem.

Now, instead outputting board configurations, return the total number of distinct solutions. ##Idea: recursion

class Solution {
public:
    int totalNQueens(int n)
    {
        int total=0;
        vector<int> location(n);
        backtrack(0,n,total,location);
        return total;
    }
private:
    void backtrack(int line,int numQ,int &total,vector<int> &location)
    {
        if(line>=numQ)
        {
            total++;
        }
        else
        {
            for(int i=0;i<numQ;i++)
            {
                if(valid(line,i,location)) 
                {
                    location[line]=i;
                    backtrack(line+1,numQ,total,location);
                }
            }
        }
    }
    bool valid(int line,int i,vector<int> &location)
    {
        for(int above=0;above<line;above++)
        {
            if(line-above==abs(location[above]-i)||i==location[above]) return 0;
        }
        return 1;
    }
};

##To Study: 1.可以用bool[n]来记录列是否被占用,bool[2*n-1]记录对角线是否被占用
2.bitwise operation+recursion

class Solution {
public:
    int totalNQueens(int n) {
        int total=0;
        nQueen(n,0,0,0,total);
        return total;
    }
private:
    void nQueen(int n,int column,int leftDown,int rightDown,int &total)
    {
        if(column==((1<<n)-1))
        {
            total++;
        }
        else
        {
            int choice=~(column|leftDown|rightDown)&((1<<n)-1);
            while(choice)
            {
                int pos=choice&(-choice);
                choice -= pos;
                nQueen(n,column+pos,(leftDown+pos)<<1,(rightDown+pos)>>1,total);
            }
        }
    }
};

3.iteration

class Solution {
public:
    int totalNQueens(int n) {
        int total=0;
        int board[n];
        int row=0;
        memset(board,-1,n*sizeof(int));
        while(row!=-1)
        {
            if(row==n)
            {
                total++;
                row--;
            }
            int i=board[row]+1;
            for(;i<n;i++)
            {
                if(valid(row,i,board)) 
                {
                    board[row]=i;
                    row++;
                    break;
                }
            }
            if(i==n)
            {
                board[row]=-1;
                row--;
            }
        }
        return total;
    }
private:
    bool valid(int line,int i,int board[])
    {
        for(int above=0;above<line;above++)
        {
            if(line-above==abs(i-board[above])||i==board[above]) return 0;
        }
        return 1;
    }
};