搜尋方法窺探

2022-03-18 14:24:14 字數 4479 閱讀 1406

一,經典搜尋(深搜和廣搜)與剪枝

int a[62

];bool v[62

];int

n;bool bingo=0

;bool cmp(int a,int b)

bool dfs(int begin,int left,int now,int

max)

return0;

}int

main()

intans;

sort(a,a+n,cmp);

memset(v,

0,sizeof

(v));

for(ans=max;ans<=sum/2;ans++)

}if(!bingo) printf("

%d\n

",sum);

}return0;

}

二,迭代加深搜尋

//

poj 3921

//給出一張有向圖,問最少刪除幾個點,能使起點到終點的最短距離大於k

/** 先用bfs找到一條最短路,然後列舉刪除每個點。刪除點的時候,可以用迭代加深。

* 先列舉所有刪除k個點的情況,如果無解,則列舉刪除k+1個點的情況 */

#define mm 4010

#define mn 100

struct

edge edge[mm];

inthead[mn], tot;

intn, m, k;

bool rem[mn]; //

false表示該點沒刪除,true表示該刪除了

intpath[mn];

intcpath[mn][mn];

queue

que;

int ite; //

表示迭代次數

int finds; //

表示是否找到解

void addline(int u, int

v) //

在有向圖中利用廣度優先搜尋找路

bool

bfs() }}

return0;

}void dfs(int

deep)

int cnt = 0

;

int v =n;

for (int i = n; v > 1; v =path[v])

cpath[deep][cnt++] =v;

if (cnt >k)

if (deep >ite)

return; //

如果深度到了,也不用找了

for (int i = 1; i < cnt; i++)

}int

solve()

return

n;}

三,雙向廣搜

//

poj 1077 康托展開 雙向廣搜

#define maxn 402880

int first[9] = ;

unsigned

int factorial[11] = ;

char tran[4

];struct

node

};int father[2

][maxn];

int ope[2

][maxn];

int dir[4][2] = , , , }; //

u, l, r, d

bool

checked[2

][maxn];

intmatchingstatus;

intmatchingq;

bool

bfs(node begin, node end)

int another = 1 -next;

node head =q[next].front();

q[next].pop();

if (checked[another][head.order])

else}}

}}

return0;

}

四,astar

#define maxn 402880

int first[9] = ;

char tran[4

];struct

node

void

getorder()

void

getf()

};void geth(node &p)

p.h = tmp * 4; //

1 倍會超時

}int

father[maxn];

intope[maxn];

int dir[4][2] = , , , }; //

u, l, r, d

intchecked[maxn]; //

0未訪問,1在open,2在close

intopendir[maxn], closedir[maxn];

multiset

open, close;

multiset

::iterator it;

bool

bfs(node end)

open.erase(open.begin());

checked[head.order] = 2

; closedir[head.order] =head.f;

x = head.space % 3

; y = head.space / 3

;

for (int i = 0; i < 4; i++)

else

if (checked[tmp.order] == 1

) }

else

if (checked[tmp.order] == 2

) }}}

}return0;

}

五,dfsid

#define mm 4010

#define mn 100

struct

edge edge[mm];

inthead[mn], tot;

intn, m, k;

bool rem[mn]; //

false表示該點沒刪除,true表示該刪除了

intpath[mn];

intcpath[mn][mn];

queue

que;

int ite; //

表示迭代次數

int finds; //

表示是否找到解

void addline(int u, int

v) //

在有向圖中利用廣度優先搜尋找路

bool

bfs() }}

return0;

}void dfs(int

deep)

int cnt = 0

;

int v =n;

for (int i = n; v > 1; v =path[v])

cpath[deep][cnt++] =v;

if (cnt >k)

if (deep >ite)

return; //

如果深度到了,也不用找了

for (int i = 1; i < cnt; i++)

}int

solve()

return

n;}

六.博弈樹的極大極小演算法與alpha –beta剪枝

《博弈知識》

思路:(1)maxfind(min):每次放x,若得到的max大於等於min,則直接返回max。

(2)minfind(max)類似;

(3)因此,列舉第乙個人放的位置,minfind,返回的是inf則勝利。

#include using

namespace

std;

#define inf 0x3fffffff

int state[5][5

], chess, xi, xj;

bool over(int x, int y)

int minsearch(int, int, int

);int maxsearch(int x, int y, int

min)

return

max;

}int minsearch(int x, int y, int

max)

return

min;

}bool

solve()

}return0;

}int

main()

getchar();

}if (chess < 4)

if (!solve())

printf(

"#####\n");

}return0;

}

窺探PTAM之模板搜尋

在跟蹤執行緒中,使用者變換攝像頭姿態或位置得到新關鍵幀,新關鍵幀需要重新查詢特徵點,找到與上一幀匹配的點以實現點跟蹤。為了快速精確地找到鄰幀對應特徵點,ptam使用一種基於斑塊搜尋的特徵匹配方法。首先從照相機採集一幀灰度影象,由運動估計模型計算乙個估計姿態。將地圖中的特徵點投影到影象上。然後進行斑塊...

窺探記憶體管理

關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程...

窺探記憶體管理

關於記憶體的問題是乙個很初級的問題也是乙個很高深的問題,確切的說是個入門必須了解的問題也是很有內涵的問題。如何認識記憶體,使用記憶體,管理記憶體是乙個一直貫穿於編碼過程的核心問題。拋棄所有的架構概念,剝離覆蓋在軟體開發的迷霧,程式本身只是乙個記憶體中資料不斷的遷移與cpu計算器不斷進行數值運算的過程...