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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

浅谈迷宫搜索类的双向bfs问题(例题解析)

發(fā)布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 浅谈迷宫搜索类的双向bfs问题(例题解析) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 前言
    • bfs類問題
    • 雙向bfs
    • 例題實戰(zhàn)

前言

文章若有疏忽還請指正,更多精彩還請關注公眾號:bigsai

在搜索問題中,以迷宮問題最具有代表性,無論是八皇后的回溯問題,還是dfs找出口,bfs找最短次數等等題目的問題。在我們剛開始ac的時候、可能有著很多滿足感!感覺是個迷宮問題咱么都可以給他這么搜出來 !!

然而,當數據達到一定程度,我們使用簡單的方法肯定會爆炸的,****。就可能需要一些特殊的巧妙方法處理,比如各種剪枝、優(yōu)先隊列、A*、dfs套bfs,又或者利用一些非常厲害的數學方法比如康托展開(逆展開)等等。而今天,我們談談雙向bfs

bfs類問題

bfs又稱廣度優(yōu)先搜索

  • 估計大部分人第一次接觸bfs的時候是在學習數據結構的二叉樹的層序遍歷!借助一個隊列一層一層遍歷。
  • 第二次估計就是在學習圖論的時候,給你一個圖,讓你寫出一個bfs遍歷的順序。

此后再無bfs…

而很多筆試面試還是其他機試其實對bfs的要求遠遠不止那么低的,需要能夠處理一些小問題、寫出對應代碼。而事bfs可以處理很多問題,很多dfs搜索能夠解決的問題bfs也能解決很多(相反也成立),并且很多跟狀態(tài)有些關系的用bfs更好控制,因為bfs借助的是一個隊列實現,隊列中儲存節(jié)點就可以保存一些節(jié)點的狀態(tài)。

不過bfs并不是萬能的,具體問題要看迷宮的大小的,迷宮長寬沒增加一個數,那么這個數量級增加是非常大的,因為搜索次數大概和邊長的指數級別有關系。當然這里不詳細介紹bfs了,大家可以看以前的一篇文章。數據結構與算法—圖論之dfs、bfs(深度優(yōu)先搜索、寬度優(yōu)先搜索)。

雙向bfs

什么樣的情況可以使用雙向bfs來優(yōu)化呢?其實雙向bfs的主要思想是問題的拆分吧,比如在一個迷宮中可以往下往右行走,問你有多少種方式從左上到右下。

  • 正常情況下,我們就是搜索遍歷,如果迷宮邊長為n,那么這個復雜度大概是2n級別.
  • 但是實際上我們可以將迷宮拆分一下,比如根據對角線(比較多),將迷宮一分為二。其實你的結果肯定必然經過對角線的這些點對吧!我們只要分別計算出各個對角線各個點的次數然后相加就可以了!
  • 怎么算? 就是從(0,0)到中間這個點mid的總次數為n1,然后這個mid到(n,n)點的總次數為n2,然后根據排列組合總次數就是n1*n2(n1和n2正常差不多大)這樣就可以通過乘法減少加法的運算次數啦!
  • 簡單的說,從數據次數來看如果直接搜索全圖經過下圖的那個點的次數為n1*n2次,如果分成兩個部分相乘那就是n1+n2次。兩者差距如果n1,n2=1000左右,那么這么一次差距是平方(根號)級別的。從搜索圖形來看其實這么一次搜索是本來一個n*n大小的搜索轉變成n次(每次大概是(n/2)*(n/2)大小的迷宮搜索兩次)。也就是如果18*18的迷宮如果使用直接搜索,那么大概2^18次方量級,而如果采用雙向bfs,那么就是2^9這個量級。

例題實戰(zhàn)

題目鏈接:http://oj.hzjingma.com/contest/problem?id=20&pid=8#problem-anchor


分析:對于題目的要求還是很容易理解的,就是找到所有的路徑種類,再判斷其中是對稱路徑的有幾個輸出即可!

對于一個普通思考是這樣的,首先是進行dfs,然后動態(tài)維護一個字符串,每次跑到最后判斷這個路徑字符串是否滿足對稱要求,如果滿足那么就添加到容器中進行判斷。可惜很遺憾這樣是超時的,僅能通過40%的樣例。

接著用普通bfs進行嘗試,維護一個node節(jié)點,每次走的時候路徑儲存起來其實這個效率跟dfs差不多依然超時。只能通過40%數據。

接下來就開始雙向bfs進行分析

  • 既然只能右下,那么對角線的那個位置的肯定是中間的那個字符串的!它的存在不影響是否對稱的(n*n的迷宮路徑長度為n-1 + n為奇數).
  • 我們判斷路徑是否對稱,只需要判斷從(1,1)到對角節(jié)點k(設為k節(jié)點)的路徑有沒有和從(n,n)到k相同的。如果有路徑相同的那么就說明這一對構成對稱路徑
  • 在具體實現上,我們對每個對角線節(jié)點可以進行兩次bfs(一次左上到(1,1),一次右下到(n,n)).并且將路徑放到兩個hashset(set1,set2)中,跑完之后用遍歷其中一個hashset中的路徑,看看另一個set是否存在該路徑,如果存在就說明這個是對稱路徑放到 總的hashset(set) 中。對角線每個位置都這樣判斷完最后只需要輸出總的hashset(set)的集合大小即可!

ac代碼如下:

import java.util.ArrayDeque; import java.util.HashSet; import java.util.Queue; import java.util.Scanner; import java.util.Set;public class test2 { static class node{int x;int y;String path="";public node() {}public node(int x,int y,String team){this.x=x;this.y=y;this.path=team;}}public static void main(String[] args) {Scanner sc=new Scanner(System.in);Set<String>set=new HashSet<String>();//儲存最終結果int n=Integer.parseInt(sc.nextLine());char map[][]=new char[n][n];for(int i=0;i<n;i++){String string=sc.nextLine();map[i]=string.toCharArray();}Queue<node>q1=new ArrayDeque<node>();//左上的隊列Queue<node>q2=new ArrayDeque<node>();//右下的隊列for(int i=0;i<n;i++){q1.clear();q2.clear();Set<String>set1=new HashSet<String>();//儲存zuoshangSet<String>set2=new HashSet<String>();//儲右下q1.add(new node(i,n-1-i,""+map[i][n-1-i]));q2.add(new node(i,n-1-i,""+map[i][n-1-i]));while(!q1.isEmpty()&&!q2.isEmpty()){node team=q1.poll();node team2=q2.poll();if(team.x==n-1&&team.y==n-1)//到終點,將路徑儲存{//System.out.println(team2.path); set1.add(team.path);set2.add(team2.path);}else {if(team.x<n-1)//可以向下{q1.add(new node(team.x+1, team.y, team.path+map[team.x+1][team.y]));}if(team.y<n-1)//可以向右{q1.add(new node(team.x, team.y+1, team.path+map[team.x][team.y+1]));}if(team2.x>0)//上{q2.add(new node(team2.x-1, team2.y, team2.path+map[team2.x-1][team2.y]));}if(team2.y>0)//左{q2.add(new node(team2.x, team2.y-1, team2.path+map[team2.x][team2.y-1]));}}}for(String va:set1){if(set2.contains(va)){set.add(va);}}}System.out.println(set.size()); } }


總結

以上是生活随笔為你收集整理的浅谈迷宫搜索类的双向bfs问题(例题解析)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩国产第一页 | 国产精品视屏 | 日日爽爽 | 国产成人精品久久二区二区 | 欧美特黄aaaaaa | 中国免费毛片 | 免费成人深夜小野草 | 四虎免费久久 | 国产成人精品999在线观看 | 亚洲国产毛片 | 1769国产精品 | 婷婷激情社区 | 国产精品不卡视频 | 男女午夜激情视频 | 在线精品国产 | 91cn.com| 欧美精品在线观看 | 夜夜狠狠 | 美女野外找人搭讪啪啪 | 性大片潘金莲裸体 | 国产吧在线 | 姐姐的秘密韩剧免费观看全集中文 | 97人人澡| 国产欧美一区二区三区在线看蜜臀 | 国产精品视频第一页 | 国产精品666 | 国产理论在线 | 国产真实在线 | 91久久婷婷 | 中文字幕网伦射乱中文 | www.亚色 | 日韩女优中文字幕 | 日本在线观看 | 亚洲激情久久 | 最新av在线播放 | 最新av在线网站 | 999国产精品视频免费 | 国产婷婷一区二区三区久久 | 精品久久久久久久久久久久久久久久 | 日韩啪啪网站 | 91久久精品夜夜躁日日躁欧美 | 日韩tv| 国产精品av网站 | 日本aaaa| 俺啪也| 国产午夜大片 | 激情全身裸吻胸 | 免费公开在线视频 | 成人久久一区二区 | 亚洲经典视频 | 久久久久亚洲色欲AV无码网站 | 日韩欧美综合视频 | 日本a在线免费观看 | 青青草日本 | 中文久久精品 | 亚洲精品欧美精品 | 闺蜜张开腿让我爽了一夜 | 韩国黄色网址 | 亚洲综合激情 | 久久久久国产精品区片区无码 | 肉丝袜脚交视频一区二区 | 超清纯大学生白嫩啪啪 | 日韩精品无码一区二区三区久久久 | 欧美精品一级二级三级 | 剧情av在线 | 午夜激情一区二区 | 国产传媒视频在线观看 | 伊人久久大香线蕉av一区 | 一区三区视频 | 国产a自拍| 亚洲人成网站999久久久综合 | 亚洲免费中文 | 丰满大乳少妇在线观看网站 | 男女男精品网站 | 玖草视频在线 | 精品日韩久久 | 国产精品99久久久久久人 | 草草影院第一页yycc.com | 天堂av资源| 一区二区三区精品在线观看 | 91免费视频网 | 欧美性猛交xxxx黑人猛交 | 国产奶水涨喷在线播放 | 国产h视频在线观看 | 美女脱了内裤喂我喝尿视频 | 欧美区一区 | 人妻无码一区二区三区久久99 | 久久手机视频 | 91在线网站 | 少妇在线视频 | 国产熟妇另类久久久久 | 熟女人妇 成熟妇女系列视频 | 青春草国产视频 | 久久久老熟女一区二区三区91 | 国产亚洲精品久久久久久久久动漫 | 亚洲精品久久夜色撩人男男小说 | 国产精品第56页 | av在线毛片 | 91精品国产91久久久久福利 |