解题思路:
要求解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 人评分
用筛法求之N内的素数。 (C语言代码)浏览:711 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:561 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:585 |
C语言程序设计教程(第三版)课后习题10.3 (C语言代码)浏览:1968 |
C语言程序设计教程(第三版)课后习题10.7 (C语言代码)浏览:743 |
输入输出格式练习 (C语言代码)浏览:774 |
判定字符位置 (C++代码)浏览:733 |
核桃的数量 (C语言代码)浏览:874 |
C语言程序设计教程(第三版)课后习题6.4 (C语言代码)浏览:479 |
WU-DNA (C++代码)浏览:804 |