回溯法之八皇后問題 詳解

2021-08-31 09:36:20 字數 1182 閱讀 3301

現在,我來說明一下八皇后的限制條件:

1.在同一行內,皇后不能出現兩次;

2.在同一列內,皇后不能出現兩次;

3.在同一條對角線內,皇后不能出現出現兩次。

問題是:找出乙個位置使得八皇后同時存放在棋盤上且互相不能進行攻擊?

根據回溯的思想,我們可以從第一行開始查詢位置,遍歷第一行,判斷是否存在可以放置的位置,如果有,就將皇后放置到那個位置,如果一行內都不存在合法位置,我們就選擇向上回溯,把上一行的位置進行修改,再繼續進行。

關於判段是否合法的方法如下:

// 判斷該位置是否可放

public boolean isvalid(int row, int column)

for (int i = 0; i < row; i++)

} return true;

}

這裡除了判斷上述的3個限制外,還增加了判斷是否為死路的語句,這是為了防止出現重複,除此之外還是繼續向上回溯的閥值條件。

整個程式**如下:

public class eightqueens 

for (int i = 0; i < 8; i++)

} }// 儲存的值對應的是矩陣中的列

public int getqueens()

public static void main(string args)

for (int i = 0; i < 8; i++)

system.out.println();

}} }

// 找出八皇后放置的正確位置

public void search() else

i--; // 重定"上一行"位置

} else

} }public void reset()

} }public int findposition(int i)

j = (j + 1) % size;

} return -1;

} // 判斷該位置是否可放

public boolean isvalid(int row, int column)

for (int i = 0; i < row; i++)

} return true;

}}

為了記錄學習的過程,寫下這篇部落格,喜歡大家多多指教!

八皇后問題(回溯法)

問題描述 八皇后問題是十九世紀著名數學家高斯於1850年提出的。問題是 在8 8的棋盤上擺放8個皇后,使其不能互相攻擊,即任意的兩個皇后不能處在同意行,同一列,或同意斜線上。可以把八皇后問題拓展為n皇后問題,即在n n的棋盤上擺放n個皇后,使其任意兩個皇后都不能處於同一行 同一列或同一斜線上。問題分...

回溯法 八皇后問題

八皇后問題是高斯於1850年提出的,這是乙個典型的回溯演算法的問題。八皇后問題的大意如下 西洋棋的棋盤有8 行 8 列共64個單元格,在棋盤上擺放八個皇后,使其不能互相攻擊,也就 是說任意兩個皇后都不能處於同一行 同一列或同一斜線上。問總共有多少種擺放方法,每一種擺 放方式是怎樣的。首先來分析八皇后...

八皇后問題 回溯法

在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法 就拿四皇后來說吧 我們首先需要建立乙個一維陣列 這個陣列裡存放的就是皇后在該列合適的位置 這個陣列存放的是皇后放的行數,我們首先在第一列中找乙個可以放的地方,很明顯第乙個位置就可以...