演算法學習之路的心得一之搜尋,二分

2021-10-19 12:17:33 字數 2103 閱讀 6956

總結

題目題解

dfs以「能走多遠就走多遠"為基本原則,是非常重要的一種搜尋方法。

這裡有乙個在洛谷看到的dfs模板

int search(int t)

else}}

}

相對的bfs就先盡可能的搜尋與已搜尋頂點相鄰的未搜尋頂點,然後以此類推不斷擴大搜尋範圍,常用來求最短路徑。

下面是用圖+佇列來實現bfs的**

計算每個頂點到開始頂點的最短路徑

int g[105][105],color[105],d[105],n,t;//color是狀態,0表示未曾進隊,1表示在佇列中,2表示出佇列      陣列d是各頂點到開始頂點的最短距離

void bfs(int u)}}

}

二分的包括二分查詢以及二分答案等等…

這裡是二分查詢的模板

int bin(int *a,int size,int p)

else if(p>a[mid])

else

} return -1;

}

如果是用c++,c++的algorithm裡面有幾個二分函式

具體呼叫如下

#include int coun(int l,int r)	//包含端點

善於運用這兩個二分查詢,其實可以用來查詢乙個區間的數,就是用上述**實現的

二分答案也有模板,具體如下

int bin(int *a,int size,int p)

else

} cout《接下來貼兩道相關的題目

題目鏈結

題目描述:由於最近的降雨,水在農民約翰的田地的不同地方聚集,這是乙個矩形n x m (1 <= n <= 100;1 <= m <= 100)正方形。每個正方形要麼包含水(『w』),要麼包含旱地(』.』)。農民約翰想算出他的田地裡已經形成了多少個池塘。池塘是一組相連的有水的廣場,乙個廣場被認為是相鄰的所有8個鄰居。給農民約翰的田地一張圖,算出他有多少個池塘。

ac**:

#include #include using namespace std;

int dx[8]=;

int dy[8]=;

int g[105][105],n,m,color[105][105],count;

void dfs(int x,int y)

if(g[nx][ny]==1&&color[nx][ny]==1)

}}int main()

else

}getchar();

} for(i=0;i題目鏈結

題目描述:有乙個長方形的房間,上面鋪著方瓷磚。每個貼圖都是紅色或黑色。乙個人站在一塊黑瓷磚上。從乙個貼圖,他可以移動到四個相鄰貼圖中的乙個。但是他不能在紅色的貼圖上移動,只能在黑色的貼圖上移動。寫乙個程式來計算他通過重複上面描述的動作可以達到的黑色方塊的數量。

解題思路:這一題我是用的bfs,同樣的我用二維陣列存下來整個圖,把能走的黑色記為0,把不能走的紅色記為1,也差不多是障礙物的意思。把開始的位置放入bfs函式裡面,從這一點開始,把這一點入隊,然後因為只有他乙個點,所以進入迴圈他就出隊了,出隊之後把它四個方向並且能走的地方繼續入隊,同時統計入隊個數,如此迴圈操作直到隊列為空了,也就是沒法再走了,答案也就出來了。

ac**

#include #include #include using namespace std;

struct node ;

int dx[4]=;

int dy[4]=;

int n,m,g[25][25],color[25][25],coun;

void bfs(int x,int y)

if(g[nx][ny]==0&&color[nx][ny]==1)}}

}int main()

else if(ch=='#')

else

}getchar();

}coun=0;

bfs(x,y);

cout<>m>>n;

getchar();

} return 0;

}

演算法學習之路 二分查詢

描述 給定乙個單調遞增的整數序列,問某個整數是否在序列中。輸入 第一行為乙個整數n,表示序列中整數的個數 第二行為n n不超過10000 個整數 第三行為乙個整數m m不超過50000 表示查詢的個數 接下來m行每行乙個整數k。輸出 每個查詢的輸出佔一行,如果k在序列中,輸出yes,否則輸出no。輸...

演算法學習 二分搜尋二分答案2

顧名思義,二分答案就是用二分查詢的思路去找答案,下面通過舉例來說明。題目 p1873 砍樹 砍下樹木的高度 h 從 0 一直到所有樹木中最高的高度 hmax 依次遞增,我們可以此為依據進行二分搜尋得出答案。includeusing namespace std long long n,m,arr 10...

演算法學習 整體二分

我們開門見山,講講一道sb題 給你乙個陣列,查這個陣列的第x大元素。排序?可以 二分?怎麼做啊?二分出乙個mid,判斷這個陣列中有多少個數小於等於mid,如果個數大於等於x,就遞迴到 l,mid 區間,否則是 mid 1,r 區間,這樣遞迴下去就能得到結果。怎麼計算小於等於mid的個數?for一遍原...