原题链接:蓝桥杯基础练习VIP-2n皇后问题
解题思路:
要求解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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复