網(wǎng)站首頁 編程語言 正文
八皇后問題是一個(gè)古老而又著名的問題,是學(xué)習(xí)回溯算法的一個(gè)經(jīng)典案例。我們不探究她的歷史,只說解決方案
在8×8格的國際象棋上擺放八個(gè)皇后,使其不能互相攻擊,即任意兩個(gè)皇后都不能處于同一行、同一列或同一斜線上,問一共有多少種擺法。
眾所周知,計(jì)算機(jī)最擅長做的就是重復(fù)的事情,而我們最樸素的感情就是遍歷所有的可能,去掉不可能的不成立方案就是結(jié)果,由于不能再同一行,所以我們每個(gè)棋子都在八行中,由于不能再同一列,所以我們只考慮不能在同一行和同一列的話,我們需要計(jì)算多少種可能呢?
s
u
m
=
A
8
8
=
40320
% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYbItLDharqqtubsr % 4rNCHbWexLMBbXgBd9gzLbvyNv2CaeHbl7mZLdGeaGqiVu0Je9sqqr % pepC0xbbL8F4rqqrFfpeea0xe9Lq-Jc9vqaqpepm0xbba9pwe9Q8fs % 0-yqaqpepae9pg0FirpepeKkFr0xfr-xfr-xb9adbaqaaeGaciGaai % aabeqaamaabaabauaakeaacaqGZbGaaeyDaiaab2gacqGH9aqpcaWG % bbWaa0baaSqaaiaaiIdaaeaacaaI4aaaaOGaeyypa0Jaaeinaiaabc % dacaqGZaGaaeOmaiaabcdaaaa!4A11! {\rm{sum}} = A_8^8 = {\rm{40320}}
sum=A88?=40320
我們?cè)趶倪@些可能中去除有在同一斜線上的不就是答案了嘛。但是這樣的話我們需要生成所有的可能并且保存這些可能進(jìn)行驗(yàn)證,這樣很浪費(fèi)時(shí)間和空間,其實(shí)我們可以在生成可能的時(shí)候就計(jì)算這個(gè)棋子放置的時(shí)候符合不符合擺放的規(guī)則,不符合就下一個(gè),符合就下一行。直到最后一行都符合的話我們就保存這個(gè)結(jié)果。
class NQueen():
def __init__(self):
self.n = 8; #定義幾個(gè)皇后
self.res = [] # 定義結(jié)果
def run(self):
self.bfs(resOfOne=[])
print(f"共有{len(self.res)}種可能")
print(self.res)
def bfs(self,resOfOne):
if len(resOfOne) == self.n:
self.res.append(resOfOne[:])
for i in range(self.n):
# 確保不在同一行同一列
if i not in resOfOne:
# 確保不在同一斜線
if self.notINBias(i,resOfOne):
resOfOne.append(i)
self.bfs(resOfOne)
resOfOne.pop(-1)
def notINBias(self,i,resOfOne):
length = len(resOfOne)
for m,n in enumerate(resOfOne):
if length-m == i-n or length+i == n+m:
return False
return True
nqueen = NQueen()
nqueen.run()
這其實(shí)就是回溯,我們把這個(gè)問題劃分成 8 個(gè)階段,依次將 8 個(gè)棋子放到第一行、第二行、第三行……第八行。在放置的過程中,我們不停地檢查當(dāng)前放法,是否滿足要求。如果滿足,則跳到下一行繼續(xù)放置棋子;如果不滿足,那就再換一種放法,繼續(xù)嘗試。
實(shí)際上我認(rèn)為回溯算法最難的是對(duì)于遞歸的理解
原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/124700559
相關(guān)推薦
- 2024-03-25 一個(gè)實(shí)體類有多個(gè)數(shù)據(jù),不寫xml,用mybatisplus進(jìn)行查詢
- 2022-07-11 docker給正在運(yùn)行中的容器添加映射端口
- 2023-08-30 liunx shell腳本并發(fā)控制詳解
- 2022-05-20 C++實(shí)現(xiàn)公司人事管理系統(tǒng)_C 語言
- 2022-04-10 Blazor實(shí)現(xiàn)數(shù)據(jù)驗(yàn)證_基礎(chǔ)應(yīng)用
- 2022-02-17 H5移動(dòng)端點(diǎn)擊出現(xiàn)背景藍(lán)色框的解決方案
- 2022-03-23 .Net?Core微服務(wù)網(wǎng)關(guān)Ocelot基礎(chǔ)介紹及集成_自學(xué)過程
- 2022-10-02 Python實(shí)現(xiàn)遍歷讀取文件或文件夾_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支