日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java实现搜索回溯经典题目

發(fā)布時(shí)間:2025/3/21 java 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java实现搜索回溯经典题目 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 前言
    • 搜索框架
    • 經(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è)公式的變種

void Search(int k) {for (i=1;i<=算符種數(shù);i++)if (滿足條件){保存結(jié)果if (到目的地) 輸出解;else Search(k+1);恢復(fù):保存結(jié)果之前的狀態(tài){回溯一步}} }

經(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è)位置是否可行;
    }
}

  • 參考代碼
public class EightQueue {/*** 存放每一行,皇后的位置,a[1]=6,代表第一行的皇后放在位置6* */int[] a = new int[9];/*** 每一列,是否被放置了皇后* */int[] b = new int[9];/*** 左對(duì)角線是否放置了皇后* */int[] c = new int[17];/*** 右對(duì)角線是否放置了皇后* */int[] d = new int[17];/*** 解法的個(gè)數(shù)* */int num = 0;public void search(int n) {// 算符種類for (int i=1; i<=8; i++) {// 判斷是否可以放棋子if(b[i]==0 && c[n+i]==0 && d[n-i+8]==0) {// 保存條件a[n] = i;b[i] = 1;c[n+i] = 1;d[n-i+8] = 1;// 目的地if (n == 8) {print(a);num ++;} else {search(n + 1);}// 回溯b[i] = 0;c[n+i] = 0;d[n-i+8] = 0;}}}public void print(int[] a) {for (int i=1; i<a.length; i++) {System.out.print(a[i] + " ");}System.out.println("");}public static void main(String[] args) {EightQueue e = new EightQueue();e.search(1);System.out.println("解法個(gè)數(shù) " + e.num);//92個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。