bobby


私信TA

用户名:yuncker

访问量:7291

签 名:

等  级
排  名 1564
经  验 2780
参赛次数 0
文章发表 23
年  龄 24
在职情况 学生
学  校 华东交通大学
专  业 软件

  自我简介:

解题思路:n皇后详解

n=int(input())
table=[]
for _ in range(n):
    table.append(list(map(int,input().split())))
def black_check(x,y):
    #检查当前是否可以放棋子
    if table[x][y]==0:
        return False
    #检查竖直有没有黑棋子
    for i in range(x):
        if table[i][y]=='b':
            return False
    #检查主对角线有没有黑棋子
    i,j=x-1,y-1
    while i>=0 and j>=0:
        if table[i][j]=='b':
            return False
        i,j=i-1,j-1
    #检查副对角线有没有黑棋子
    i,j=x-1,y+1
    while i>=0 and j=0 and j>=0:
        if table[i][j]=='w':
            return False
        i,j=i-1,j-1
    #检查副对角线有没有白棋子
    i,j=x-1,y+1
    while i>=0 and j<n:
        if table[i][j]=='w':
            return False
        i,j=i-1,j+1
    return True
cnt=0
def b_dfs(b_x):
    #print('我进来了b_dfs')
    global cnt
    global table
    if b_x==n:
       # print('黑' ,table)
       # 黑棋子放好了放白棋子
        w_dfs(0)
        return
    for y in range(n):
        if black_check(b_x,y):
            table[b_x][y]='b'
            b_dfs(b_x+1)
            table[b_x][y]=1
    return

def w_dfs(w_x):
    global cnt
    global table
    #print('我进来了w_dfs')
    if w_x==n:
        #白棋子放完了,数量加1
        cnt+=1
        #print('白',table)
        return
    for y in range(n):
        if white_check(w_x,y):
            table[w_x][y]='w'
            w_dfs(w_x+1)
            table[w_x][y]=1
    return
b_dfs(0)
print(cnt)


 

0.0分

8 人评分

  评论区

  • «
  • »