ENEN


私信TA

用户名:dotcpp0603045

访问量:124

签 名:

等  级
排  名 62748
经  验 210
参赛次数 0
文章发表 1
年  龄 0
在职情况 学生
学  校 HUNNU
专  业

  自我简介:

TA的其他文章

解题思路:

       要求解2n皇后问题要先会求解n皇后问题,这里推荐一个b站视频,讲得挺好,用C++写的思路很清晰,唯一不足的地方是在dfs(row+1)后面的a[row]=0,这里有点画蛇添足了,我的理解是dfs完row+1层返回后仍然会继续进行for循环,没有必要将a[row]置为0,反而会让人难以理解。

       能够求得n皇后问题后就可以在check函数里检查棋盘位置是否允许摆放皇后,2n皇后可以看作先摆一种颜色的皇后,然后再摆另外一种,只需要将n皇后的解组合就可以直接得到2n皇后的解 
注意事项:

       推荐视频的代码是用C++写的,用Python写2n皇后的时候注意一个特殊情况,range(0)是空的!
参考代码:

n皇后代码:

n = int(input())
## cnt记录可行解的数量
cnt = 0
## a记录可行的放置方法 分别对应第0 1 2 ... n行皇后放置的位置
a = []
## 这里添加n个0是因为n行要放n个皇后,这里置为0不影响,后面会覆盖的,只起到一个占位置的作用
for i in range(n):
    a.append(0)
## check函数 检查第x行的皇后能否放置在y位置上 注意这里的位置从0开始
def check(x,y):
    for i in range(x):
        ## 这里可能有一点难以理解 你可以类比于把皇后们放在坐标上 然后直线(一共三条)就可以用y=kx+b表示 非常好理解
        if a[i] == y or a[i]+i == x+y or a[i]-i == y-x:
            return False
    return True
## dfs函数 进行深度优先搜索
def dfs(k):
    ## 如果已经到达过了底层就返回(这里层数也从0开始 所以第n-1层才是最底层)并且打印放置方法
    if k == n:
        global cnt
        cnt += 1
        print(a)
        return
    ## 没到底就继续深度搜索
    for i in range(n):
        if check(k,i):
            a[k] = i
            dfs(k+1)
dfs(0)
print(cnt)

2n皇后代码:

n = int(input())
hmap = []
## hmap记录是否可以放皇后
a = []
for i in range(n):
    ## 这里同样只起占位作用
    hmap.append([])
    a.append(0)
    hmap[i] = list(map(int,input().split()))
## one_list记录hmap条件下n皇后的可行解
one_list = []
#cnt记录hmap条件下n皇后解的数目 ans为2n皇后解的个数
cnt = 0
ans = 0
def check(x,y):
    ## 这里有坑!!!!
    ## range(0)是空的!!! 所以需要看x是不是0行 否则直接就返回True了
    ## 还是c方便 ~ ̄▽ ̄~
    if x == 0 and hmap[x][y] == 0:
        return False
    for i in range(x):
        if hmap[x][y] == 0:
            return False
        if a[i] == y or a[i]+i == x+y or a[i]-i == y-x:
            return False
    return True
 
def dfs(k):
    if k == n:
        global cnt
        cnt += 1
        one_list.append(a[:])
        return
    for i in range(n):
        if check(k,i):
            a[k] = i
            dfs(k+1)
## 判断n皇后解是否有位置相同
def notsame(x,y):
    for i in range(n):
        if one_list[x][i] == one_list[y][i]:
            return False
    return True
dfs(0)
 
for i in range(len(one_list)):
    for j in range(i+1,len(one_list)):
        if notsame(i,j):
            ans += 1
## 黑白选择方案有组合数 A(2-2)=2
print(2*ans)

ps:先在csdn上也写这个2n皇后的求解(刚来还没2级不能发题解`(>﹏<*)′)

 

0.0分

1 人评分

  评论区

  • «
  • »