首页新闻找找看学习计划

大家对于N皇后问题,有什么高明的解法,一起探讨一下。

0
悬赏园豆:50 [待解决问题]

N皇后问题

N 皇后问题,就是在一个N * N 的棋盘中,摆放N个皇后棋子,这两N个皇后不能出现 两个在同一横线,同一竖线,同一斜线上。

请大家各抒己见,畅所欲言。

补充:

不是高明的解法,是用最短,最优雅的代码。

`

Shendu.CC的主页 Shendu.CC | 小虾三级 | 园豆:1947
提问于:2019-08-27 11:42
< >
分享
所有回答(2)
0

没啥高明的解法,就百度里说的回溯法。如果用栈,可能会简单一点

会长 | 园豆:5046 (大侠五级) | 2019-08-27 11:48

好的。那么广搜呢?

支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 12:26

@Shendu.CC: 没听过呀,孤陋寡闻了。

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-27 12:39

@会长: 为什么用栈会简单呢?用栈模拟递归吗?

支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 13:18

@Shendu.CC: n个位置都不满足条件就可以把上一个皇后出栈重新安排位置,感觉容易点

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-27 13:22

@Shendu.CC:

class Queen(object):
    def __init__(self, row, column):
        self.__row = row
        self.__column = column
    
    @property
    def row(self):
        return self.__row

    @row.setter
    def row(self, value):
        self.__row = value

    @property
    def column(self):
        return self.__column

    @column.setter
    def column(self, value):
        self.__column = value

def valid(row, column, stack):
    for item in stack:
        if item.row == row:
            return False
        if item.column == column:
            return False
        if abs(item.row - row) == abs(item.column - column):
            return False
    return True

def fuckQueen(n):
    row = 0
    column = 0  
    stack = []

    while row < n:
        done = False
        for column_index in range(column, n):
            if valid(row, column_index, stack):
                stack.append(Queen(row, column_index))
                done = True
                row += 1
                column = 0
                break
        if done == False:
            queen = stack.pop()
            row -= 1
            column = queen.column + 1

    return stack

if __name__ == "__main__":
    
    stack = fuckQueen(4)
    for item in stack:
        print(item.row, ' ', item.column)

我只给出一个解,没有遍历所有解,不管怎么说,用了栈,你不用栈试试会不会比这个复杂

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-27 14:03

@会长: 稍等哦。

支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 14:16

@Shendu.CC: 刚才有个地方写错了,我改了下,应该是break,不是continue

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-27 14:18

@会长:

c++ 递归

class Solution {
public:
    vector<vector<string>> ans;
    int a[100][100];
    int m;
    vector<vector<string>> solveNQueens(int n) {
        
        m=n;
        memset(a,0,sizeof(a));
        fun(0);
        
        return ans;
    }
      
    
    void fun(int pos)
    {
        if(pos==m)
        {
            ans.push_back(getString());
            return;
        }
        for(int i=0;i<m;i++)
        {
            if(a[pos][i]==0)
            {
                a[pos][i]=1;
                setLock(pos,i,2);
                fun(pos+1);
                setLock(pos,i,-2);
                a[pos][i]=0;
            }
        }
    }
    void setLock(int x,int y,int num)
    {
        for(int i=x+1;i<m;i++)
        {
            a[i][y]+=num;
        }
        int tag=1;
        for(int i=x+1;i<m;i++)
        {
            if(y+tag<m)
                a[i][y+tag]+=num;
            if(y-tag>=0)
                a[i][y-tag]+=num;
            
            tag++;
        }
    }
    
    vector<string> getString()
    {
        vector<string> res;
       
        for(int i=0;i<m;i++)
        {
            string s="";
            for(int j=0;j<m;j++)
            {
                if(a[i][j]==1)
                {
                    s+='Q';
                }
                else
                    s+='.';
            }
            res.push_back(s);
        }
        return res;
    }
    
};
支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 15:09

@会长: https://leetcode.com/problems/n-queens/

你可以用python把这道题目过一下,我不会python 不好改你的代码。

支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 15:12

@Shendu.CC: 我没看懂,啊哈哈。我小时候上学老师出过这个题目,记得当时不会写,从网上找的代码,不过没有用到栈,也是回溯法。感觉用栈方便一些。

关键代码的行数,我看你的c++代码比我的python代码还多一点。虽然看不懂,但是我觉得用栈代码会少一点,你用栈试试

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-27 15:48

@会长: @会长: 我用了 栈的
https://leetcode.com/problems/n-queens-ii/

过了这一题。

class Solution {
public:
    int ans=0;
    int a[100][100];
    int m;
    int x[100005];
    int y[100005];
    int s[100005];
    int p[100005];
    int totalNQueens(int n) {

        m=n;
        memset(a,0,sizeof(a));
        int pos=0;
        s[pos]=0;
        x[pos]=-1;
        y[pos]=-1;
        p[pos]=-1;
        pos++;
        while(pos!=0)
        {
            int i=s[pos-1];
            
            if(i==n)
            {  
                ans++; 
            }

            if(p[pos-1]<=n-1&&i!=n)
            {
                p[pos-1]++;
                while(a[i][p[pos-1]]!=0)
                {
                    p[pos-1]++;
                }
                if(p[pos-1]!=n){
                    
                
                a[i][p[pos-1]]=1;
                setLock(i,p[pos-1],2);
                s[pos]=i+1;
                x[pos]=i;
                y[pos]=p[pos-1];
                p[pos]=-1;
                pos++;
                
                continue;
                }
            }
           
            if(pos==1)
                break;
            
            a[x[pos-1]][y[pos-1]]=0;
            setLock(x[pos-1],y[pos-1],-2);
            pos--;
        }
        
        return ans;
        
    }
    
    void setLock(int x,int y,int num)
    {
        for(int i=x+1;i<m;i++)
        {
            a[i][y]+=num;
        }
        int tag=1;
        for(int i=x+1;i<m;i++)
        {
            if(y+tag<m)
                a[i][y+tag]+=num;
            if(y-tag>=0)
                a[i][y-tag]+=num;
             
            tag++;
        }
    }
     
  
};
支持(0) 反对(0) Shendu.CC | 园豆:1947 (小虾三级) | 2019-08-27 19:50

@Shendu.CC: 赞

支持(0) 反对(0) 会长 | 园豆:5046 (大侠五级) | 2019-08-28 08:23
0

可以用位运算优化

End_donkey | 园豆:202 (菜鸟二级) | 2019-08-27 17:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册