1.定義:搜尋演算法是利用計算機的高效能來有目的地窮舉乙個問題的部分或所有的可能情況,從而求出問題的解的一種方法。2.相比於列舉演算法的優點:相比於單純的列舉演算法有了一定的方向性和目標性。演算法是在解的空間裡,從乙個狀態轉移(按照要求拓展)到其他狀態,這樣進行下去,將解的空間中的狀態遍歷,找到答案(目標的狀態)。
dfs演算法的思想是從乙個被選定的點出發一條路走到底,如果得不到目的解,那就返回到上乙個節點,然後換一條路繼續走到底,直到找到目的解返回或者全部遍歷完返回乙個事先定好的值。dfs一般借用遞迴完成整個演算法的構造。
1每次取出棧頂元素,對其進行拓展。2若棧頂元素無法繼續拓展,則將其從棧中彈出。繼續1過程。
3不斷重複直到獲得目標狀態(取得可行解)或棧為空(無解)。
void bfs()
while()
return ;
}
bfs演算法的思想是從乙個被選定的點出發;然後從這個點的所有方向每次只走一步的走到底(即其中乙個方向走完一步之後換下乙個方向繼續走);如果得不到目的解,那就返回事先定好的值,如果找到直接返回目的解。與dfs不同的是,bfs不是運用的遞迴,而是運用佇列實現的。
1每次取出佇列首元素(初始狀態),進行拓展2然後把拓展所得到的可行狀態都放到佇列裡面
3將初始狀態刪除
4一直進行以上三步直到隊列為空。
void bfs()
...dfs();
...//具體要怎麼搜尋
}
dfs:就是以一種單一方式走到黑,然後通過回溯等得到答案的過程。bfs框架bfs:先看有多少種方式可以走,然後先記錄每一種方式,再按這種方式一層一層遍歷,直到得到最後結果。
二者用途:dfs和bfs大都運用在圖的處理上:如迷宮,八皇后 等,在這些型別的題上幾乎全需要dfs或bfs來解
區別之處:bfs適合求最短路徑,dfs適合求所有答案,
#include#include#include#includeusing namespace std;
const int maxn=100;
bool vst[maxn][maxn]; // 訪問標記
int dir[4][2]=; // 方向向量
struct state // bfs 佇列中的狀態資料結構
;state a[maxn];
bool checkstate(state s) // 約束條件檢驗
void bfs(state st)
for(int i=0;i<4;i++)
}q.pop(); // 隊首元素出隊。其實前面取了q.front()就可讓隊首元素出隊了。
}return;
}int main()
dfs框架
//該dfs 框架以2d 座標範圍為例,來體現dfs 演算法的實現思想。
#include#include#includeusing namespace std;
const int maxn=100;
bool vst[maxn][maxn]; // 訪問標記
int map[maxn][maxn]; // 座標範圍
int dir[4][2]=; // 方向向量,(x,y)周圍的四個方向
bool checkedge(int x,int y) // 邊界條件和約束條件的判斷
void dfs(int x,int y)
for(int i=0;i<4;i++)
return; // 沒有下層搜尋節點,回溯
}int main()
題意:
兩邊的人同時開槍,那麼我又多少種中彈順序呢?比如我有100血,而乙個人用衝鋒槍每發子彈能傷害我30血,另乙個人用步槍每發子彈能傷害我45血,那導致我死亡的中彈順序可能是,30 30 30 45,也可能是 45 45 30,也有可能是45 30 45,等等。當然,血量小於或等於0都算被擊倒。輸入:同時要注意,如果兩人每次對自己造成的傷害是相同的,但仍被看作不同的死亡順序,比如玩家有100血量,左右兩邊的人每次能造成50血量的傷害,那麼答案為4,情況分別為:
50 50(左邊敵人打中了兩槍)。
50 50(右邊敵人打中了兩槍)
50 50(左邊敵人開了第一槍)
50 50(右邊敵人開了第一槍)
本題有多組測試資料。每組佔一行,由三個正整數m n hp組成(10=輸出:思路:對於每組輸入資料,輸出一行,結果為玩家有多少種死亡順序,即中彈順序。
看題意是求出所有方式,所以用dfs,然後,先以第一種方式減血(第乙個例子,-45,-45,-45。。。),然後就回溯,繼續操作,
#includeusing namespace std;
int ans=0,l,r,hp;
void dfs(int hp,int l,int r)
dfs(hp-l,l,r);
dfs(hp-r,l,r);
} int main();
int v[101][101],d[101][101];
queue q;
void bfs(int x,int y)
if(map[i][j]=='e')
}bfs(sx,sy);
if(d[ex][ey]==0)
else
cout<<"escaped in "<}
}
ACM之近期學習總結
最近acm沒有學什麼新演算法,只是做了一些題,相當於補了一些以前掌握不好的知識點。接下來總結一下近期做題過程中所學。最近在洛谷上做了一道黑色星期五的問題,通過這道題我掌握了 i.為了方便用陣列儲存每月的天數,且月份符合實際意義,我們一般這樣定義陣列 int a 13 即將a 0 設為0,正常的a 1...
ACM近期之學習總結
先說一下這幾天的學習情況吧。這幾天雖然vjudge上的題目不能提交啦,但是還是要以前沒有看過的題補一遍。其中,做了幾道dfs和bfs的題目,還看了幾道bfs bit位運算結合,以及full tank 最短路徑 dp 最短路徑變形的問題。我感覺這兩個知識點掌握的不是很好,只是略懂皮毛,沒有理解的很透徹...
學習總結 近期acm學習的總結
開學已經乙個月了,對acm的學習也乙個月了,做了一下總結 對自己不好的地方的反省 1.開學一開始學的是stl,不得不說stl是乙個很好的東西,熟練的運用stl大大的減少了 量,也使演算法容易實現。但是我在用stl後使自己產生了一種惰性思維。在兩個星期的stl練習後,我發現自己變得越來越懶,不願意自己...