# 2n皇后问题



时间限制: 1Sec 内存限制: 128MB 提交: 1133 解决: 557

提交地址：

https://www.dotcpp.com/oj/problem1460.html

**题目描述**
```
给定一个n*n的棋盘，棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后，使任意的两个黑皇后都不在同一行、同一列或同一条对角线上，任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法？n小于等于8。
输入
输入的第一行为一个整数n，表示棋盘的大小。 

接下来n行，每行n个0或1的整数，如果一个整数为1，表示对应的位置可以放皇后，如果一个整数为0，表示对应的位置不可以放皇后。
```
**输出**

- 输出一个整数，表示总共有多少种放法。 

**样例输入**
```
4
1 1 1 1 
1 1 1 1 
1 1 1 1 
1 1 1 1
```
**样例输出**
```
2
```


```

def m():
    n=int(input())
    nn=[]
    for i in range(n):
        nn.append(input().strip().split())
        res=[]
    def helper(row,temp,nn,cols,z,f):
        if row==n:
            res.append(temp)
            return 
        for col in range(n):
            if (col not in cols )and( (row+col)not in z) and ((row-col) not in f) and nn[row][col]=='1':
                helper(row+1,temp+[nn[row][:col]+['2']+nn[row][col+1:]],nn,cols|{col},z|{row+col},f|{row-col})
    helper(0,[],nn,set(),set(),set())
    re_=len(res)
    for i in range(len(res)):
        helper(0,[],res[i],set(),set(),set())
    return len(res)-re_
print(m())
```

    4
    1 1 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1
    2


### 小提示
- 对于n皇后问题，因为同一行、同一列或同一条对角线上都不能放置皇后，所以我们的思路是使用递归来遍历行，然后用for循环遍历列，同时建立列跟对角线的集合，只有不在集合中的位置才能放置皇后。
- 那么对于2n皇后问题我们就先对nn进行一次n皇后问题，接下来就在这个所有的放置完黑皇后的可能下来放置白皇后，等于是跑了两遍n皇后的算法来解决这个问题。



```
# n=int(input())
# nn=[]
# nn.append(list(map(int,input().split())))
def m():
    n=int(input())
    nn=[]
    for i in range(n):
        nn.append(list(input().split()))
    res=[[]]
    
    r=0
    def helper(i,temp,nn,col,z,f,l):
        if i==n:
#             print('t',temp)
#             print('r',l,res[l])
            res[l].append(temp)
            return 
    
        for j in range(n):
            if (j not in col)and ((i+j) not in z)and ((i-j) not in f )and nn[i][j]=='1':
                helper(i+1,temp+[list(''.join(nn[i][:j])+'2'+''.join(nn[i][j+1:]))],nn,col|{j},z|{i+j},f|{i-j},l)
    helper(0,[],nn,set(),set(),set(),0)
    #print('res',res)
    for k in range(len(res[0])):
        res.append([])
        helper(0,[],res[0][k],set(),set(),set(),k+1)
        #print(len(res[k+1]))
        r+=len(res[k+1])
    return r
print(m())

        
```

    4
    1 0 1 1 
    1 1 1 1
    1 1 1 1
    1 1 1 1
    0
