八皇后问题初始思路python_Python 学习笔记(一)10行代码解决八皇后问题
不引入標(biāo)準(zhǔn)庫和第三方庫,不用分號將多行代碼寫在一行,再10行代碼之類求出八皇后問題的所有解。
---------------------------------------------------------------------------------------
輸出結(jié)果為列表l,l[i]表示第i+1行的皇后應(yīng)放置的列序號。l的初始值是[0]*8,如果第1行的皇后放置在第一列,那么輸出值中l(wèi)[0]=1。
思路圖:
l[0] l[1] l[2] l[3] l[4] l[5] l[6] l[7]
i |
k |
m |
從第1行開始一次放置皇后,
指針i用于標(biāo)定現(xiàn)在正在放置哪一行的皇后,當(dāng)放置完成后,指針i向后移動一位(如放置完第6行,指針i從l[5]移動到l[6],并開始放置第7行的皇后)。
指針k用于檢驗第i+1行的皇后是否與第k+1行的皇后在同一列或同一條直線上。如果不滿足條件,將i指針?biāo)傅脑丶?(將第i+1行的皇后向右移動一列),k指針歸0(重新檢驗)。
指針m用于檢驗各元素是否溢出,因為棋盤只有8列,所以各元素的值只能取1到8,如果前i行的皇后放置得不好,可能造成在第i+1行,不論把皇后放在哪一列,都不能滿足條件。這種情況下,按照對指針k和指針i的定義,元素l[i]的值會超過8。因此,當(dāng)最終確定l[i]的值后,指針m從l[i]開始,檢驗元素是否大于8,如果沒有,m向前移以為(這個操作貌似不必要,以后看看可不可以在不增加代碼行數(shù)的情況下省略);如果有,將該元素歸零后,m向前移動一位,給將前一位元素加一(即方向第i+1行放不了皇后,把第i行皇后向右移動一列,再看看能不能放得下),然后繼續(xù)檢查這個元素是否大于8(如果第i行的元素本身就在第8行了,那么只能再把這一行的皇后重新放置,并把第i-1行的皇后右移一位)。當(dāng)指針m移到某個元素,給該元素加1后,檢測到該元素沒有大于8,將指針i移動至這個位置,繼續(xù)進(jìn)行前面兩個步驟。
輸出八皇后問題第一個解的代碼:
l, i = [0]*8, 0
while i < 8:
k, l[i] = 0, l[i] + 1
while k < i:
if l[i] == l[k] or abs(l[i] - l[k]) == i - k: l[i], k = l[i] + 1, -1
k += 1
i += 1
for m in range(i - 1, 0, -1):
if l[m] > 8: l[m], i = 0, m - 1
print(l)
輸出八皇后問題所有解的代碼:
l, i = [0]*8, 0
while l[0] < 9:
k, l[i] = 0, l[i] + 1
while k < i:
if l[i] == l[k] or abs(l[i] - l[k]) == i - k: l[i], k = l[i] + 1, -1
k += 1
for m in range(i, 0, -1):
if l[m] > 8: l[m], i = 0, m - 2
if i < 7: i += 1
else: print(l)
這兩個代碼的區(qū)別在于:
對于第一個腳本,當(dāng)確定第8行皇后的位置后(確定l[7]的值后),將指針i移出列表索引的范圍,因此不滿足第2行的判定條件,循環(huán)結(jié)束。然后輸出列表l
l[0] l[1] l[2] l[3] l[4] l[5] l[6] l[7]
i |
k |
m |
對于第二個腳本,當(dāng)確定第8行皇后的位置后(確定l[7]的值后),輸出列表值(觸發(fā)第10行else條件),將指針i不動。繼續(xù)循環(huán),按要求繼續(xù)移動3個指針。注意到按照我所給定的條件移動指針和更新數(shù)值,當(dāng)找完8皇后問題的所有解后,l[0]必將溢出正常范圍,因此,我們將循環(huán)結(jié)束的條件設(shè)置為l[0]>=9。
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的八皇后问题初始思路python_Python 学习笔记(一)10行代码解决八皇后问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python多线程网络编程_python
- 下一篇: tensorflow lstm 预测_解