当前位置:   article > 正文

N皇后问题(dfs理解版)

N皇后问题(dfs理解版)

题目:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同对角线(本例考虑了副对角线,有些题目不考虑)

回溯(还原现场)理解:走到头发现走不通了(某个row进行dfs的时候没有一个col满足条件了)返回上一层,在上一层走没走完的for循环,因为上一层的时候,标记了这个位置,进入下一层,没有进行后面回溯的代码,所以发现这条路走不通的时候返回上一层,把走的前面那一步标记为未访问,上一层for循环去搜索下一个col。

  1. n=int(input())
  2. zhu=[0]*(2*n-1)#主对角线,0表示没被标记
  3. fu=[0]*(2*n-1)#副对角线
  4. cols=[0]*n#列需要标记而行不需要,它是一行一行进行dfs的
  5. rows=[-1]*n#-1表示没放皇后,0-(n-1)表示皇后在该行所在的列数
  6. cnt=0#计数器,表示方法数
  7. def dfs(row):
  8. global cnt
  9. for col in range(n):
  10. if zhu[row-col+n-1]==0 and fu[row+col]==0 and cols[col]==0:#用and,只有主对角线,副对角线,列数都没有被标记才可以搜索
  11. zhu[row-col+n-1]=1#满足条件就标记
  12. fu[row+col]=1
  13. cols[col]=1
  14. rows[row]=col
  15. #表示第row行,第col列放置皇后
  16. if row<n-1:
  17. dfs(row+1)
  18. else:
  19. printqueen()
  20. cnt+=1
  21. zhu[row-col+n-1]=0
  22. fu[row+col]=0
  23. cols[col]=0
  24. rows[row]=-1
  25. def printqueen():
  26. for i in range(n):
  27. for j in range(n):
  28. if rows[i]==j:
  29. print('Q',end=' ')
  30. else: print('0',end=' ')
  31. print()
  32. print()
  33. dfs(0)
  34. print(cnt)
'
运行

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/825418
推荐阅读
相关标签
  

闽ICP备14008679号