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