Java实现搜索回溯经典题目
文章目錄
- 前言
- 搜索框架
- 經(jīng)典問題
前言
- 搜索與回溯是計(jì)算機(jī)解題中常用的算法,很多問題無法根據(jù)某種確定的計(jì)算法則來求解,可以利用搜索與回溯的技術(shù)求解。回溯是搜索算法中的一種控制策略。它的基本思想是:為了求得問題的解,先選擇某一種可能情況向前探索,在探索過程中,一旦發(fā)現(xiàn)原來的選擇是錯(cuò)誤的,就退回一步重新選擇,繼續(xù)向前探索,如此反復(fù)進(jìn)行,直至得到解或證明無解。
- 如迷宮問題:進(jìn)入迷宮后,先隨意選擇一個(gè)前進(jìn)方向,一步步向前試探前進(jìn),如果碰到死胡同,說明前進(jìn)方向已無路可走,這時(shí),首先看其它方向是否還有路可走,如果有路可走,則沿該方向再向前試探;如果已無路可走,則返回一步,再看其它方向是否還有路可走;如果有路可走,則沿該方向再向前試探。按此原則不斷搜索回溯再搜索,直到找到新的出路或從原路返回入口處無解為止。
搜索框架
搜索偽代碼/公式
基本上所有的搜索與回溯都是這個(gè)公式的變種
經(jīng)典問題
【問題1】八皇后問題
- 題目
八皇后問題:要在國(guó)際象棋棋盤中放八個(gè)皇后,使任意兩個(gè)皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一對(duì)角線的任意棋子。)
- 分析
放置第i個(gè)(行)皇后的算法為:
int search(i);
{
int j;
for (第i個(gè)皇后的位置j=1;j<=8;j++ ) //在本行的8列中去試
if (本行本列允許放置皇后)
{
放置第i個(gè)皇后;
對(duì)放置皇后的位置進(jìn)行標(biāo)記;
if (i==8) 輸出 //已經(jīng)放完個(gè)皇后
else search(i+1); //放置第i+1個(gè)皇后
對(duì)放置皇后的位置釋放標(biāo)記,嘗試下一個(gè)位置是否可行;
}
}
- 參考代碼
【問題2】自然數(shù)分解
任何一個(gè)大于1的自然數(shù)n,總可以拆分成若干個(gè)小于n的自然數(shù)之和
當(dāng)n=7共14種拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14
【代碼實(shí)現(xiàn)】
public class SplitData {int[] a;int goal;/*** 任何一個(gè)大于1的自然數(shù)n,總可以拆分成若干個(gè)小于n的自然數(shù)之和* 算符種類:要分割的自然數(shù)n* 結(jié)果數(shù)組:a[n],存儲(chǔ)這分割的結(jié)果* */void search(int n, int t) {// 算符種類,從1開始,一直到nfor (int i=a[t-1]; i<=n; i++) {// 滿足條件,把分解的數(shù)字存入數(shù)組并在n基礎(chǔ)上減去// 當(dāng)前數(shù)i要大于等于前1位數(shù),且不過nif(i < goal) {a[t] = i;n -= i;if (n == 0) {print(t);} else {search(n, t+1);}n += i;}}}public void print(int t) {System.out.println("結(jié)果為:");for (int i=1; i <= t; i++) {System.out.print(a[i] + " ");}System.out.println("");}public static void main(String[] args) {SplitData s = new SplitData();// 想要分解的自然數(shù)int n = 7;s.a = new int[n+1];for (int i=0; i<s.a.length; i++) {s.a[i] = 1;}s.goal = n;s.search(n,1);} }總結(jié)
以上是生活随笔為你收集整理的Java实现搜索回溯经典题目的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构-深度优先遍历和广度优先遍历(漫
- 下一篇: Java 洛谷 P1219 八皇后