搜尋演算法學的差不多了,今天就整體總結一下吧,附帶兩個習題,以方便日後複習
搜尋的兩種演算法:深度搜尋,廣度搜尋
廣度搜尋的思想:
核心演算法:佇列;
基本步驟:
1、將最初狀態新增到對列
2、將佇列的前端不斷取出
3、佇列後端新增改狀態,可以轉移並且沒有被訪問過的狀態
4、最後知道找到結果或者隊列為空時結束;
深度搜尋的思想:
核心演算法:遞迴
基本步驟:
定義函式,然後利用自身一直遞迴,知道最後得出結果
def function(parameter)
深度搜尋經典習題:
迷宮 【問題描述】
給定乙個n*m方格的迷宮,迷宮裡有t處障礙,障礙處不可通過。給定起點座標和
終點座標,問: 每個方格最多經過1次,有多少種從起點座標到終點座標的方案。在迷宮
中移動有上下左右四種方式,每次只能移動乙個方格。資料保證起點上沒有障礙。
輸入樣例 輸出樣例
【資料規模】
1≤n,m≤5
題目描述
輸入輸出格式
輸入格式:
【輸入】
第一行n、m和t,n為行,m為列,t為障礙總數。第二行起點座標sx,sy,終點
座標fx,fy。接下來t行,每行為障礙點的座標。
輸出格式:
【輸出】
給定起點座標和終點座標,問每個方格最多經過1次,從起點座標到終點座標的方
案總數。
輸入輸出樣例
輸入樣例#1:
2 2 1
1 1 2 2
1 2輸出樣例#1:
1具體**實現:
#include#include#include#define maxn 20
using namespace std;
int map[maxn][maxn];//表示迷宮地圖
bool temp[maxn][maxn];//標記是否走過
int dx[4]=;//橫座標的上下左右
int dy[4]=;//縱座標的上下左右
int m,n,total,sx,sy,fx,fy,l,r,t;//m,n:地圖的長寬,total:方案總數,sx,sy起點的橫縱座標,fx,fy:終點的橫縱座標,t:障 礙總數,l,r:障礙座標
void search(int x,int y)//x,y:現在所在的點的座標
for(int i=0;i<=3;i++)
if(temp[x+dx[i]][y+dy[i]]==0&&map[x+dx[i]][y+dy[i]]==1)//判斷下面要走的路是否有障礙
if(x+dx[i]>=1&&y+dy[i]>=1&&x+dx[i]<=n&&y+dy[i]<=m)//判斷是否超越迷宮邊界
}int main()
map[sx][sy]=0;
search(sx,sy);
printf("%d",total);
return 0;
}
廣度搜尋經典習題:
【題目描述】
當你站在乙個迷宮裡的時候,往往會被錯綜複雜的道路弄得失去方向感,如果你能得到迷宮地圖,事情就會變得非常簡單。
假設你已經得到了乙個n*m的迷宮的圖紙,請你找出從起點到出口的最短路。
【輸入】
第一行是兩個整數n和m(1≤n,m≤100),表示迷宮的行數和列數。
接下來n行,每行乙個長為m的字串,表示整個迷宮的布局。字元『.』表示空地,『#』表示牆,『s』表示起點,『t』表示出口。
【輸出】
輸出從起點到出口最少需要走的步數。
【輸入樣例】
3 3s#t
.#.…
【輸出樣例】
6**實現:
#includeusing namespace std;
int mx[4]=,my[4]=;
bool a[105][105];
int n,m,sx,sy,fx,fy,nowx,nowy,nows,i,j,l;
bool flag;
struct node;
};bool inside(int x,int y)
queueq;
int main()
q.push(node(sx,sy,0));
a[sx][sy]=1;
flag=0;
while(!q.empty())
if(nowx==fx&&nowy==fy)
}if(flag)
break;
q.pop();
} node k=q.back();
cout
}
ACM搜尋題目總結
格式說明 題目名後面列出個人此題的大致難度 對菜鳥而言 poj 1069 the bermuda 難 題意 用給定三角型填充六邊形 解法 此題的思想上精華在於座標化 ps 傳說中比較bt,確實比較bt,主要很容易寫錯,我ac了,但程式沒完全對.poj 1077 eight 中等,此題不做人生不完整 ...
ACM搜尋題目總結
格式說明 題目名後面列出個人此題的大致難度 對菜鳥而言 poj 1069 the bermuda 難 題意 用給定三角型填充六邊形 解法 此題的思想上精華在於座標化 ps 傳說中比較bt,確實比較bt,主要很容易寫錯,我ac了,但程式沒完全對.poj 1077 eight 中等,此題不做人生不完整 ...
ACM搜尋演算法總結
一 回溯演算法 回溯演算法是所有搜尋演算法中最為基本的一種演算法,其採用了一種 走不通就掉頭 思想作為其控制結構,其相當於採用了先根遍歷的方法來構造解答樹,可用於找解或所有解以及最優解。評價 回溯演算法對空間的消耗較少,當其與分枝定界法一起使用時,對於所求解在解答樹中層較深的問題 有較好的效果。但應...